回复 5# csynyk 的帖子
这应该是他们学C一学期后考试的题。在北大的 onlinejudge http://acm.pku. 上难题还是很多的。
/******************************************************************************* 描述 名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0)。妈妈告诉名名每天可以吃一块或者两块巧克力。假设名名每 天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。例如:如果N=1,则名名 第1天就吃掉它,共有1种方案;如果N=2,则名名可以第1天吃1块,第2天吃1块,也可 以第1天吃2块,共有2种方案;如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天 吃2块剩1块,所以名名共有2+1=3种方案;如果N=4,则名名可以第1天吃1块,剩3块, 也可以第1天吃2块,剩2块,共有3+2=5种方案。现在给定N,请你写程序求出名名吃巧 克力的方案数目。 关于输入 输入只有1行,即整数N。 关于输出 输出只有1行,即名名吃巧克力的方案数。 例子输入 4 例子输出 5 提示 无。 ################################################################################ 根据一个朋友的提示,引用了兔子问题的解法。大数(如20)的结果也不晓得正确 与否,还望各位指正。 *******************************************************************************/ #include<stdio.h> #define N 20 int main(void) { int i,n; int a[N]={1,2,3,0}; printf("请输入巧克力的数量(小于20的正整数):\n"); while(9) /*控制输入的数字为小于20的正整数*/ { scanf("%d",&n); if(n<0||n>20) continue; else break; } if(n<=3) printf("共有%d种吃法。\n",n); else { for(i=3;i<n;i++) a[i]=a[i-1]+a[i-2]; printf("共有%d种吃法\n",a[i-1]); } getch(); }
/******************************************************************************* 假设a、b、c均为整数,且满足a,b,c 大于1,并且小于等于100,找出所有符合 条件:a2 + b2 = c2 的整数组。 关于输入 无。 关于输出 按a从小到大的顺序输出所有满足条件的整数组(若a相同,则按b从小到大的顺序 输出),每行一组,每一组数据的输出样式为: 3*3 + 4*4 = 5*5 注意: 1)3*3 + 4*4 = 5*5 和 4*4 + 3*3 = 5*5是同一组数据,后者不要输出; 2)加号和等号左右各有一个空格 3)9*9 + 12*12 = 15*15 (在前) 9*9 + 40*40 = 41*41 (在后) *******************************************************************************/ #include<stdio.h> #define M 2 #define N 100 int check(int *p,int *q,int n,int a,int b) /* 检查函数,用于检查是否有相同的数据存在 */ { int i,m=1; for(i=0;i<n;i++) if(((a==p[i]&&b==q[i])||(a==q[i]&&b==p[i]))) /* 如果发现a*a+b*b=c*c 的数据出现过,返回0 */ m=0; return m; } int main(void) { int a,b,c,i=0; int k[200]={0},l[200]={0}; for(a=M;a<=N;a++) for(b=M;b<=N;b++) for(c=M;c<=N;c++) if(a*a+b*b==c*c) { k[i]=a; l[i]=b; if(check(k,l,i,a,b)) /* 如果检查没有相同数据,就打印结果 */ printf("%d*%d + %d*%d = %d*%d\n",a,a,b,b,c,c); i++; } getch(); }