博文
三进制小数(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......
幻方的几种构造方法(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;
......
打印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......
旅行家的预算(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......
半数集问题(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;
}
......
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;
......
排队买票(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......
马拦过河卒(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......
回文(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)......
孤独的骑士(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;
}
......