博文
三进制小数(2007-06-17 17:23:00)
摘要:三进制小数
时间限制:1000MS 内存限制:65536KTotal Submit:14 Accepted:2
问题描述
你的任务呢,是将一个有理数转换成三进制小数。“什么是三进制小数呢?”你一定会问,这很明白,就是以三为基(二进制数以2为基,而十进制数则以10为基)的小数。
输入
有理数的值都是在0与1之间的,每个有理数都由一个分子和一个分母表示,分子与分母之间隔着一个斜杠。有理数的个数不会超过1000个。
输出
输出格式见样本输出,它是以小数点开头的具有10位精度的3进制数。
输入样例
1 / 31 / 41 / 67 / 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; a = a*3%b; } test(save); for(i=0; i<10; i++) printf("%d",save[i]); ......
幻方的几种构造方法(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; if(j>n) &......
打印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的形状,每组输出间有一空行。
输入样例
23 15 4
输出样例
X X XX X
X X X X X X XX X X X X X XX X X X X X XX X X X X X XX 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 i,j; for(j = i = 0; j <= b; ){ printf("%s\n",m[i]); j = (i==0 ? j+1 : j); i = (i==a-2 ? 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.82102.0 2.9220.0 2.2 Sample Output 26.95 Problem Source NOI
// 测试用例275.6 11.9 17.4 2.82102.0 2.9220.0 2.2142.54
275.6 11.9 10.4 2.83 102.0 2.1160.2 2.3220.0 2.262.99 // mycode 2007--6--8
#include <stdio.h>#include <float.h>
typedef struct node{ float d; float j; float dist;}NODE;
int main(){ float money,maxoil,totald,spee......
半数集问题(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)中的元素个数。
输入样例
699
输出样例
69042
// 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;}......
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;
i = j......
排队买票(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){ TREE *temp; if(n==0 && k==0) return ; if(n >= 1){ &n......
马拦过河卒(2007-06-02 21:49:00)
摘要:马拦过河卒
时间限制:10000MS 内存限制:65536KTotal 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,&yd,&xh,&yh)!=EOF){ for(k = i = 0; i < 8; i++){ &nb......
回文(2007-06-02 12:58:00)
摘要:回文数(一)
时间限制:10000MS 内存限制:65536KTotal 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。
输入样例
3128789
输出样例
140
// 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){ int i,j; for(i = 0,j = strlen(str)-1; j > i; i++,j--) if(str[i] != str[j])&nb......
孤独的骑士(ACM)(2007-06-01 21:53:00)
摘要:问题描述
任务很简单. 确定国际象棋棋盘上处于骑士攻击之下的格子个数. 棋盘上没有其它棋子. 骑士的走法: 横
(纵)向走两个格, 再纵(横)向走一个格(类似于中国象棋中的马).
输入
第一行为测试次数N, 1 ≤ N ≤ 100. 后面N行每行包含一个坐标表示骑士的位置. 字母表示横向位置, 数字表示纵向位置.
输出
输出N行. 每行一个整数, 表示骑士可攻击的格子个数.
输入样例
3a1d4g6
输出样例
286
// 注意国际象棋的棋盘为 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;}......
