C/C++语言经典、实用、趣味程序设计编程百例精解(5-6
41.马克思手稿中的数学题
马克思手稿中有一道趣味数学问题:有30个人,其中有男人、女人和小孩,在一家饭馆吃饭花了50先令;每个男人花3先令,每个女人花2先令,每个小孩花1先令;问男人、女人和小孩各有几人?
*问题分析与算法设计
x,y,z分别代表男人、女人和小孩。按题目的要求,可得到下面的方程:
x+y+z=30 (1)
3x+2y+z=50 (2)
用方程程序求此不定方程的非负整数解,可先通过(2)-(1)式得:
2x+y=20 (3)
(3)式可知,x变化范围是0~10
*程序说明与注释
#include<stdio.h>
int main()
{
int x,y,z,count=0;
printf(" Men Women Children\n");
printf("………………………………….\n");
for(x=0;x<=10;x++)
{
y=20-2*x; /*x定值据(3)式求y*/
z=30-x-y; /*(1)式求z*/
if(3*x+2*y+z==50) /*当前得到的一组解是否满足式(2)*/
printf(" %2d: %d %d %d\n",++count,x,y,z);
}
}
 
 42.最大公约数和最小公倍数
求任意两个正整数的最大公约数和(GCD)和最小公倍数(LCM)
*问题分析与算法设计
手工方式求两个正整数的蝚大公约数的方法是用辗转相除法,在程序中可以模拟这种方式。
*程序说明与注释
#include<stdio.h>
int main()
{
int a,b,num1,num2,temp;
printf("Input a & b:");
scanf("%d%d",&num1,&num2);
if(num1>num2) /*出两个数中的较大值*/
{
temp=num1; num1=num2; num2=temp; /*交换两个整数*/
}
a=num1; b=num2;
while(b!=0) /*采用辗转相除法求最大公约数*/
{
temp=a%b;
a=b;
b=temp;
c语言游戏编程题经典100例}
printf("The GCD of %d and %d is: %d\n",num1,num2,a); /*输出最大公约数*/
printf("The LCM of them is: %d\n",num1*num2/a); /*输出最小公倍数*/
}
*运行结果
1.Input a & b: 20 55
The GCD of 20 and 55 is: 5
The LCM of them is: 220
2.Input a & b: 17 71
The GCD of 17 and 71 is: 1
The LCM of them is: 1207
3.Input a & b: 24 88
The GCD of 24 and 88 is: 8
The LCM of them is: 264
4.Input a & b: 35 85
The GCD of 35 and 85 is: 5
The LCM of them is: 595
*思考题
求一个最小的正整数,这个正整数被任意n(2<=n<=10)除都是除不尽的,而且余数总是(n-1)。例如:被9除时的余数为8。要求设计一个算法,不允许枚举与除2、除3….、除9、除10有关的命令,求出这个正整数。
43.分数比较
比较两个分数的大小。
*问题分析与算法设计
人工方式下比较分数大小最常用的方法是:进行分数的通分后比较分子的大小。可以编程模拟手式方式。
*程序说明与注释
#include<stdio.h>
int zxgb(int a,int b);
int main()
{
int i,j,k,l,m,n;
printf("Input two FENSHU:\n");
scanf("%d/%d,%d/%d",&i,&j,&k,&l); /*输入两个分数*/
m=zxgb(j,l)/j*i; /*求出第一个分数通分后的分子*/
n=zxgb(j,l)/l*k; /*求出第二个分数通分后的分子*/
if(m>n) printf("%d/%d>%d/%d\n",i,j,k,l); /*比较分子的大小*/
else if(m==n) printf("%d/%d=%d/%d\n",i,j,k,l); /*输出比较的结果*/
else printf("%d/%d<%d/%d\n",i,j,k,l);
}
int zxgb(int a,int b)
{
long int c;
int d;
if(a<b) c=a,a=b,b=c; /*a<b,则交换两变量的值*/
for(c=a*b;b!=0;)
{
d=b; b=a%b; a=d;
}
return (int)c/a;
}
*运行结果
输入: 4/56/7 输出: 4/5<6/7
输入: 8/416/32 输出: 8/4>16/32
输入:16/324/8 输出: 16/32=4/8
44.分数之和
求这样的四个自然数p,q,r,s(p<=q<=r<=s),使得以下等式成立:
1/p+1/q+1/r+1/s=1
*问题分析与算法设计
若规定p<=q<=r<=s,将原式通分、化简并整理后得到:
2<=p<5 p<=q<7 q<r<13
采用最简单的穷举方法可以很方便的求解。
程序与程序注释:
#include<stdio.h>
int main()
{
int p,q,r,s,count=0;
printf("The 4 fractions which sum is equal 1 are:\n");
for(p=2;p<5;p++) /*穷举分母*/
for(q=p;q<7;q++)
for(r=q;r<13;r++)
if(p*q*r-q*r-p*r-p*q!=0)
{
s=(p*q*r)/(p*q*r-q*r-p*r-p*q); /*求出s的值*/
if(!((p*q*r)%(p*q*r-q*r-p*r-p*q))&&s>=r)
printf("[%2d] 1/%d+1/%d+1/%d+1/%d=1\n",++count,p,q,r,s);
/*输出结果*/
}
}
*运行结果
*思考题
123456789九个数字分成以下三种分数形式之一,每个数字只能用一次,使得该分数刚好等于一个整数。
求所有满足条件的表示形式。
(参考答案:某些自然数没有这种表示形式,如:12341518等。此外整数10011种满足条件的表示形式;89的表示形式最多,共有36种;三种形式中,最大可表示的整数为794)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。