今天我们来练习几个趣味的函数求解,函数虽然不难,不过要注意循环的使用和相应判断:
题目如下:
1.百钱百鸡问题:
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡”的问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁,母,雏各几何?
题目分析:
设鸡翁,鸡母,鸡雏的个数分别为x,y,z,提议给定共100钱买百鸡,若全买公鸡最多买20只,显然x ~(0--20),同理,y~(0--33);并且 5x + 3y + z/3 = 100;
x + y + z = 100;
程序如下:
#include <stdio.h>
int main()
{
int x;
int y;
int z;
int j = 0;
printf("Following are possible plan to buy 100 fowls with 100 yuan:\n");
for(x = 0; x <= 20; x++)
{
for(y = 0; y <=33; y++)
{
z = 100 - x - y;
if(z % 3 == 0 && 5 * x + 3 * y + z / 3 == 100)
{
printf("%2d:cock=%2d hen=%2d chicken=%2d\n",++j, x, y, z);
}
}
}
return 0;
}
2.爱因斯坦的数学题:
爱因斯坦出了这样一个数学题:有一条长阶梯,若每步跨两阶,则最后剩1 阶;若每步跨3阶则最后剩两阶;若每布跨5阶,则最后剩4阶;若每步跨6阶,则最后剩5阶;只有每步跨7阶,最后才正好一阶不剩;
问题分析:
阶梯数满足下面一组同余式:
X = 1 (mod2)
X = 2 (mod3)
X = 4 (mod5)
X = 5 (mod6)
X = 0 (mod7)
程序如下:
#include <stdio.h>
int main()
{
int i = 1;
while(!((i%2==1) && (i%3==2) && (i%5==4) && (i%6==5) &&(i%7==0)))
{
++i;
}
printf("Staris_number= %d\n",i);
return 0;
}
3.换分币:
用一元人民币兑换成1分,2分和5分硬币,共有多少种兑换方法?
问题分析:
设i, j , k 分别为兑换的 1分,2分和5分硬币所具有的钱数(i / 1, j/2, k/5 则为对应的数目),则i,j,k 满足:i + j + z = 100;
程序如下:
#include <stdio.h>
int main()
{
int i;
int j;
int k;
int count = 1;
printf("There are following small exchange plans for 1 yuan note:\n");
for(i = 0; i <= 100; i++)
{
for(j = 0; j <= 100-i; j=j+2)
{
for(k = 0; k <= 100-i-2*j; k=k+5)
{
if(i + j + k == 100)
{
printf(count%4?"%d:1*%d+2*%d+5*%d\n":
"%d:1*%d+2*%d+5*%d\n", count++, i, j/2, k/5);
printf("\n");
}
}
}
}
return 0;
}
4.三色球问题:
若一个口袋中放有12个球,其中三个红的,3个白的和6个黑的,问任取8个球,共有多少种颜色搭配?
问题分析:
设取出的红球,白球数目分别为 i , j,则黑球数目为为8 - i - j; 根据题意,红球和白球取值为(0~3),所以此时黑球个数应为(8 - i - j) <= 6。
程序如下:
#include <stdio.h>
int main()
{
int i;
int j;
int count = 0;
printf("No. RED BALL WHITE BALL BLACK BALL\n");
printf("--------------------------------\n");
for(i = 0; i <= 3; i++)
{
for(j = 0; j <= 3; j++)
{
if((8-i-j) <= 6)
{
printf("%2d: %d %d %d\n", ++count, i, j, 8-i-j);
}
}
}
return 0;
}