回复 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();
}