博文

三进制小数(2007-06-17 17:23:00)

摘要:三进制小数 时间限制:1000MS  内存限制:65536K
Total Submit:14 Accepted:2 问题描述 你的任务呢,是将一个有理数转换成三进制小数。“什么是三进制小数呢?”你一定会问,这很明白,就是以三为基(二进制数以2为基,而十进制数则以10为基)的小数。 输入 有理数的值都是在0与1之间的,每个有理数都由一个分子和一个分母表示,分子与分母之间隔着一个斜杠。有理数的个数不会超过1000个。 输出 输出格式见样本输出,它是以小数点开头的具有10位精度的3进制数。 输入样例
1 / 3
1 / 4
1 / 6
7 / 8
输出样例
.1000000000
.0202020202
.0111111111
.2121212122 // my code #include <stdio.h>
void test(int a[]){
 int i;
 if(a[10] >= 2)
  a[9]++;
 else
  return;
 for(i=9; i>=0; i--){
  if(a[i]>=3){
   a[i]=0;
   a[i-1]++;
  }
  else
   break;
 } }
int main(){
 int  i,a,b,save[12];
 char c;
 while(scanf("%d %c %d",&a,&c,&b)!=EOF){
  printf(".");
  for(i=0; i<11;i++){
   save[i] = a*3/b;
  &nb......

阅读全文(5374) | 评论:0

幻方的几种构造方法(2007-06-15 16:45:00)

摘要:幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.
(以下程序输入的 n 要求 n<30 并且 n 为奇数,输入0 结束) 构造 1 :
#include <stdio.h>
#include <string.h> void out(int n){
    int i,j,k,a[32][32];
    memset(a,0,sizeof(int)*32*32);
    j=n/2+1;
    a[1][j]=1;
    for(k=2;k <= n*n; k ++){
        i=i-1;
        j=j+1;
        if((i<1)&&(j>n)){
            i=i+2;
            j=j-1;
        }
        else{
            if(i<1)
                i=n;
  ......

阅读全文(2700) | 评论:0

打印DNA(2007-06-14 16:26:00)

摘要:打印 DNA 形状 问题描述 小强从小就喜欢生命科学,他总是好奇花草鸟兽从哪里来的。终于, 小强上中学了,接触到了神圣的名词--DNA.它有一个双螺旋的结构。这让一根筋的小强抓破头皮,“要是能画出来就好了” 小强喊道。现在就请你帮助他吧! ^_^ 输入 输入包含多组测试数据。第一个整数N(N<=15),N表示组数,每组数据包含两个整数a,b。a表示一个单位的DNA串的行数,a为奇数且 3<=a<=39。b表示重复度(1<=b<=20)。 输出 输出DNA的形状,每组输出间有一空行。 输入样例
2
3 1
5 4 输出样例
X X
 X
X X X   X
 X X
  X
 X X
X   X
 X X
  X
 X X
X   X
 X X
  X
 X X
X   X
 X X
  X
 X X
X   X // MY CODE 07-6-14 #include <stdio.h>
#include <string.h>
#define MAX 42 void SetMetrix(char m[][MAX], int a){
 int i,j;
 for(i = j = 0; i < a; i++,j++)
  m[i][j] = 'X';
 for(j=a-1,i=0; i < a; i++,j--)
  m[i][j] = 'X';
 for(i=0, j=a; i < a; i++)
  m[i][j] = '\0';
} void Print(char m[][MAX], int a, int b){
 int......

阅读全文(3565) | 评论:0

旅行家的预算(acm)(2007-06-08 08:17:00)

摘要:旅行家的预算 
Problem description
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市 之间的距离D1、汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2、出发点每升汽油价格P和沿 途油站数N(N可以为零),油站i离出发点的距Di、每升汽油价格 Pi( i=l,2,...N)。计算结果四舍 五入至小数点后两位。如果无法到达目的地,则输出“No solution”。  
Input
输入数据的第一行是四个实数;
D1 C D2 P分别表示两个城市之间的距离,汽车油箱的容量,每升汽油能行驶的距离,出发点每升汽油价 格;
第二行是一个整数N,沿途的油站数。
第三行到第N+2,每一行是一个油站的基本信息描述,包括该油站离出发点的距离,该油站每升汽油的价 格。  
Output
输出到达目的城市的最小费用(四舍五入到两位小数),若不能到达目的城市则输出 No solution  
Sample Input
275.6  11.9   27.4  2.8
2
102.0  2.9
220.0   2.2
 
Sample Output
26.95
 
Problem Source
NOI // 测试用例
275.6  11.9   17.4  2.8
2
102.0  2.9
220.0   2.21
42.54 275.6  11.9   10.4  2.8
3
102.0  2.1
160.2  2.3
220.0  2.2
62.99
 
// mycode 2007--6--8 #include <stdio.h>
#include <float.h> typedef......

阅读全文(6697) | 评论:1

半数集问题(2007-06-06 20:24:00)

摘要:问题描述 问题描述:
给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下。
(1) n∈set(n);
(2) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;
(3) 按此规则进行处理,直到不能再添加自然数为止。
例如,set(6)={6,16,26,126,36,136}。半数集set(6)中有6 个元素。
注意半数集是多重集。 编程任务:
对于给定的自然数n,编程计算半数集set(n)中的元素个数。 输入 输入数据m行,每行给出一个整数n。(0〈n〈1000) 输出 输出只有m行,每行给出半数集set(n)中的元素个数。 输入样例
6
99 输出样例
6
9042 // mycode ,这里是“多重集”,非多重集有点麻烦 #include <stdio.h> int a[1000],aj; void get(int n){
 int i,j,k;
 for(i=aj+1; i <= n; i++){
  k = i/2;
  for(a[i]=j=1; j <= k; j++)
   a[i] = a[i] + a[j];
 }
 aj = n;
}
int main(){
 int n;
 aj = a[0] = a[1] = 1;
 while(scanf("%d",&n)!=EOF){
  if(n > aj)
   get(n);
  printf("%d\n",a[n]);
 }
 return 0;
}
......

阅读全文(4260) | 评论:0

24点速算(2007-06-06 14:13:00)

摘要:问题描述 速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断是否有解。我们另外规定,整个计算过程中都不能出现小数。   输入 输入数据占一行,给定四张牌。 输出 如果有解则输出"Y",无解则输出"N"。 输入样例
A 2 3 6 输出样例
Y // my code 2007--6--6#include <stdio.h> #include <ctype.h> int Get(int j, int sum,int a[]){ if(j==4 && sum==24) return 1; else if(j==4) return 0; if(Get(j+1,sum+a[j],a)) return 1; if(Get(j+1,sum-a[j],a)) return 1; if(Get(j+1,sum*a[j],a)) return 1; if(Get(j+1,sum/a[j],a)) return 1; return 0; } int main(){ int i,j,k,t,a[4]; char d[4]; scanf("%c %c %c %c",&d[0],&d[1],&d[2],&d[3]); for(i = 0; i < 4; i++) a[i] = (isdigit(d[i]) ? d[i]-48 : d[i]-64); for(i = k = 0; k < 24; k++){ if(Get(1,a[0],a)){ printf("Y\n"); return 0; } j = (i >= 3 ? 0 : i+1); t = a[i]; a[i] = a[j]; a[j] = t; ......

阅读全文(3525) | 评论:2

排队买票(2007-06-05 22:51:00)

摘要:
问题描述 有M个小孩到公园玩,门票是1元。其中N个小孩带的钱为1元,K个小孩带的钱为2元。售票员没有零钱,问 这些小孩共有多少种排队方法,使得售票员总能找得开零钱。注意:两个拿一元零钱的小孩,他们的位置 互换,也算是一种新的排法。(M<=10)
输入 输入一行,M,N,K(其中M=N+K,M<=10). 输出 输出一行,总的排队方案。 输入样例
4 2 2 输出样例
8 /***********************************************
 题目可能不是很难,和排列组合有关,我的数学不是
 很好但这题能想到解法,不过却想了很久不知道怎么
 表达这个解法,开始用想用普通数组通过递归求解。
 没解决,最后终于想到了二叉树,呵呵,总算解决了
 不过遗憾,开始没考虑特殊数据 1 1 0 ,WA了一次
 题目 M<=10,以下程序不受此限制。
   --- 2007--6--5 ---
 ***********************************************/ #include <stdio.h>
#include <malloc.h> typedef struct tree{
 int i,dibs;
 struct tree *left,*right,*parent;
}TREE; TREE* GetTreeNode(void){
 TREE *temp;
 temp = (TREE*)malloc(sizeof(TREE));
 temp->dibs = temp->i = 0;
 temp->left = temp->right = temp->parent = NULL;
 return temp;
} void CreateTree(int n, int k, TREE **p){
&nb......

阅读全文(3307) | 评论:0

马拦过河卒(2007-06-02 21:49:00)

摘要:马拦过河卒 时间限制:10000MS  内存限制:65536K
Total Submit:9 Accepted:3 问题描述 棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳 跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
  棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达 B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。 输入 一行四个数据,分别表示B点坐标和马的坐标。(保证所有的数据有解) 输出 一个数据,表示所有的路径条数。 输入样例
6 6 3 3 输出样例
6 题目来源 // MY CODE (注意卒不能通过马所在的位置,象棋里是可以的) #include <stdio.h> struct node{
 int  right;
 int  down;
 int  x,y;
}stack[40]; struct horse{
 int x,y;
}horse[8]; int test(int x,int y,struct horse *h,int k){
 int i;
 for(i = 0; i < k; i++)
  if(h[i].x == x && h[i].y == y)
   return 1;
 return 0;
} int main(){
 int  xd,yd,xh,yh,i,k,m;
 int  b[] = {-2,-1,1,2,2,1,-1,-2};
 int  c[] = {1,2,2,1,-1,-2,-2,-1};  while(scanf("%d%d%d%d",&xd,&y......

阅读全文(6335) | 评论:1

回文(2007-06-02 12:58:00)

摘要:回文数(一) 时间限制:10000MS  内存限制:65536K
Total Submit:33 Accepted:10 问题描述 若一个数(首位不为0)从左到右读与从右到左读都是一样,这个数就叫做回文数,例如12521就是一个回 文数。
给定一个正整数,把它的每一个位上的数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则 停止,如果不是,则重复这个操作,直到和为回文数为止。给定的数本身不为回文数。
例如:87则有:
STEP1: 87+78=165
STEP2: 165+561=726
STEP3: 726+627=1353
STEP4: 1353+3531=4884
编写一个程序,输入M(12<=M<=100),输出最少经过几步可以得到回文数。如果在8步以内(含8步)不可 能得到回文数,则输出0。   输入 第1行一个正整数L,代表测试数据的组数。
接下来L行每行一个整数M(12<=M<=100),M本身不为回文数;   输出 输出L行,第i行对应输入数据的第i+1行,输出最少需要的步数;如果步数大于8,则输出0。 输入样例
3
12
87
89   输出样例
1
4
0
// my code #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
void revsStr(char *str){
 unsigned int i,j;
 char c;
 for(i = 0,j = strlen(str)-1; j > i; i++,j--){
  c = str[i];
  str[i] = str[j];
  str[j] = c;
 }
} int testStr(char *str)......

阅读全文(2799) | 评论:0

孤独的骑士(ACM)(2007-06-01 21:53:00)

摘要:问题描述 任务很简单. 确定国际象棋棋盘上处于骑士攻击之下的格子个数. 棋盘上没有其它棋子. 骑士的走法: 横 (纵)向走两个格, 再纵(横)向走一个格(类似于中国象棋中的马). 输入 第一行为测试次数N, 1 ≤ N ≤ 100.
后面N行每行包含一个坐标表示骑士的位置.
字母表示横向位置, 数字表示纵向位置. 输出 输出N行. 每行一个整数, 表示骑士可攻击的格子个数. 输入样例
3
a1
d4
g6 输出样例
2
8
6 // 注意国际象棋的棋盘为 8*8 的矩阵 #include <stdio.h>
#include <stdlib.h>
int main(){
 int  k,n,i,x,y;
 int  b[] = {-2,-1,1,2,2,1,-1,-2};
 int  c[] = {1,2,2,1,-1,-2,-2,-1};
 char str[4];  scanf("%d",&n);
 for(; n > 0; n--){
  scanf("%s",str);
  y = tolower(str[0]) - 'a';
  x = str[1] - '1';
  for(k = 0,i = 0; i < 8; i++){
   if(x+c[i]<0 || x+c[i]>7 || y+b[i]<0 || y+b[i]>7)
    continue;
   k++;
  }
  printf("%d\n",k);
 }
 return 0;
}
......

阅读全文(3063) | 评论:0