1.舍罕王的失算
题目要求:舍罕是古印度的国王,据说他十分好玩,宰相达依尔为讨好国王,发明了现今的国际象棋献给国王。舍罕非常喜欢这项游戏,于是决定嘉奖达依尔,许诺可以满足达依尔提出的任何要求。达依尔指着舍罕王前面的棋盘提出要求:“陛下,请您按棋盘的格子上次我一点麦子吧,第1个小格赏我一粒麦子,第2个小格赏我两粒,第3个小格赏四粒,以后每一小格都比前一小格赏的麦粒数增加一倍,只要把棋盘上全部64个小格按这样的要求得到的麦粒都赏赐给我,我就心满意足了。”舍罕王听了达依尔的这个“小小的”要求,想就没想就满口答应了。
程序代码:
#include<stdio.h>
#include<math.h>
main()
{
int i;
double sum=0.0;
for(i=1;i<=64;i++)
sum+=pow(2,i-1);
printf("the summary is %g/n",sum);
}
程序说明:程序中定义sum为double类型是因为该题目的运算结果为一个20位十进制的大数,在C语言中的基本数据类型中,只有double类型和long double类型的数据可以容纳。
2.求两个数的最大公约数和最小公倍数。
题目要求:编写一个程序计算两个正整数的最大公约数和最小公倍数。
程序代码:
方法一:
#include<stdio.h>
#include<math.h>
main()
{
int a,b,r,temp,max,min;//定义从键盘输入的两个数与一个余数
printf("please input two numbers:/n");
scanf("%d,%d",&a,&b);
if(a<b){//保证a比b大
temp=a;
a=b;
b=temp;
}
max=a;
min=b;
r=a%b;
while(r!=0)//求最大公约数
{
a=b;
b=r;
r=a%b;
}
printf("最大公约数为:%d/n",b);
//求最小公倍数
printf("最小公倍数为:%d/n",(max*min/b));
}
方法二:
一个数i为a和b的公共因数,那么一定满足a%i等于0,并且b%i等于0.所以,设计算法时只要从i=min(a,b)开始依次递减1,并逐一判断i是否为a和b的公共因数,得到的第一个公因数就是a和b的最大公因数。
一个数i为a和b的公共倍数,那么一定满足i%a等于0,并且i%b等于0.所以,设计算法时只要从i=max(a,b)开始依次加1,并逐一判断i是否为a和b的公共倍数,得到的第一个公倍数就是a和b的最大公倍数。
程序代码:
#include<stdio.h>
#include<math.h>
int gcd(int a,int b){//求最大公约数
int min;
if(a<0 || b<0)
return 0;
if(a<b)
min=a;
else min=b;//找到a,b中较小的一个数赋予min
while(min){
if(a%min==0 && b%min==0)//判断公因数
return min;//找到最大公约数返回
min--;//没找到最大公约数,min减1
}
return -1;
}
int icm(int a,int b){
int max;
if(a<0 || b<0)
return 0;
if(a>b)
max=a;
else max=b;
while(max){
if(max%a==0 && max%b==0)
return max;
max++;
}
return -1;
}
main()
{
int a,b;
printf("please input two numbers:/n");
scanf("%d,%d",&a,&b);
printf("the gcd of %d and %d is %d/n",a,b,gcd(a,b));//输出最大公约数
printf("the icm of %d and %d is %d/n",a,b,icm(a,b));//输出最小公倍数
}
3.哥德巴赫猜想的近似值
题目要求:众所周知,哥德巴赫猜想的证明是一个世界性的数学难题。至今不能解决。我国著名数学家陈景润为哥德巴赫猜想的证明做出过杰出的贡献。
所为哥德巴赫猜想是说任何一个大于2的偶数都能表示为两个素数之和。应用计算机工具可以很快地在一定范围内验证哥德巴赫猜想的正确性。请编写一个C程序,验证指定范围内哥德巴赫猜想的正确性,也就是证明哥德巴赫猜想(因为不可能用计算机穷举出所有正偶数)
题目分析:可以应用枚举的方法列出指定范围内的每一个偶数,然后判断它是否满足哥德巴赫猜想的论断,一旦发现有不满足哥德巴赫猜想的数据,则可以跳出循环,并做出否定的结论;否则,如果集合内的数据都满足哥德巴赫猜想的论断,则可以说明在指定范围内,哥德巴赫猜想
是正确的。
这一过程的伪码算法为:
low 范围上界
high 范围下界
a<-low
repeat:
if a为偶数并且a>2 then
if a满足哥德巴赫猜想 then
输出一种结论
else
设置标志,跳出循环
endif
endif
a<-a+1
until a>high
if设置标志 then 哥德巴赫猜想不成立
else 在[low,high]内哥德巴赫猜想成立
一个正偶数a一定可以表示成为a/2中正整数相加的形式。这是因为a=a+(a-1);a=2+(a-2);a=3+(a-3);......;a=a/2-1+a/2+1;a=a/2+a/2;共a/2种。后面还有a/2-1种表示形式和前面a/2+1中表示形式相同,因此可以不予考虑。那么,在这a/2种正整数相加的形式中,只要存在一种形式a=i+j,其中i和j均为素数,则就可以断定该偶数a满足哥德巴赫猜想。因此,判断一个大于2的偶数a是否满足哥德巴赫猜想的伪码算法描述为:
i<-1
repeat:
if i是素数 and a-i也是素数 then
设置标志,跳出循环
endif
i<-i+1
until i>a/2
if 设置标志 then a满足哥德巴赫猜想
else a不满足哥德巴赫猜想
程序代码:
#include<stdio.h>
#include<math.h>
int isGoldbach(int a);
int TestfyGB_Guess(int low,int high);
int isPrime(int i);
main()
{
/*验证1~100以内的哥德巴赫猜想*/
printf("now testify Goldbach Guess in the range of 1~100/n");
if(TestfyGB_Guess(1,100))
printf("In the range of 100,Goldbach Guess is right./n");
else printf("Goldbach Guess is wrong/n");
}
int TestfyGB_Guess(int low,int high){//在low和high之间验证哥德巴赫猜想
int i,j=0,flag=0;
for(i=low;i<=high;i++){
if(i%2==0 && i>2)
if(isGoldbach(i)){
j++;
if(j%5==0)
{
printf("/n");
j=0;
}
}
else{
flag=1;
break;
}
}
if(flag==1)
return 1;
else
return 0;
}
int isGoldbach(int a){//判断偶数是否满足哥德巴赫猜想
int i,flag=0;
for(i=0;i<=a/2;i++)
if(isPrime(i) && isPrime(a-i)){
flag=1;
printf("%d=%d+%d",a,i,a-i);
break;
}
if(flag==1)
return 1;
else
return 0;
}
int isPrime(int i){//判断一个数是否为素数
int flag=1,n;
if(i==1)
flag=0;
for(n=2;n<i;n++)//如果在2~n-1之间i有其他因子,则i不是素数,flag置0
if(i%n==0){
flag=0;
break;
}
if(flag==1)
return 1;
else
return 0;
}
4.三色球问题
题目要求:有红、黄、绿三种颜色的球,其中红球3个,黄球3个,绿球6个。现将这12个球混放在一个盒子中,从中任意摸出8个球,编程计算摸出球的每种颜色搭配。
程序代码:
#include<stdio.h>
#include<math.h>
main(){
int red,yellow,green;
for(red=0;red<=3;red++)
for(yellow=0;yellow<=3;yellow++)
for(green=2;green<=8;green++)
if(red+yellow+green==8)
printf("%d %d %d/n",red,yellow,green);
}
5.百钱买百鸡问题
题目要求:我国古代数学家张邱建在《算经》一书中提出过著名的“百钱买百鸡”问题。该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一&