北理工C语言2.docx
- 文档编号:4910335
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:25
- 大小:29.32KB
北理工C语言2.docx
《北理工C语言2.docx》由会员分享,可在线阅读,更多相关《北理工C语言2.docx(25页珍藏版)》请在冰豆网上搜索。
北理工C语言2
2-1.编程,输出200以内所有完全平方数C(满足C2=A2+B2)及其个数。
结果:
254个C:
No.CAB
1534
2543
31068
41086
513512
613125
…………
25420019256
分析:
影响答案的因素有A、B、C,它们的取值范围均为1~200。
所以用三重循环穷举A、B、C可能的值,输出满足条件C2=A2+B2的C、A、B及C的个数。
。
main()/*sj1-2-1*/
{longa,b,c,n=0;
for(c=1;c<=200;c++)
for(a=1;a<=200;a++)
for(b=1;b<=200;b++)
if(c*c==a*a+b*b)
printf("No.%3ld:
%ld*%ld=%ld*%ld+%ld*%ld\n",++n,c,c,a,a,b,b);
}
2-2.设N是一个四位数,它的9倍恰好是其反序数(例如:
123的反序数是321),编程,输出所有满足条件的N。
结果:
1089
分析:
对4位数n循环(n=1000~9999)将n的各位数字分解为i、j、k、m后,输出满足下列条件的n:
(i*103+j*102+10k+m)*9=(m*103+k*102+10j+i)。
也可以令i、j、k、m分别表示n的千、百、十、个位数字,用4重循环(i=1~9,j、k、m=0~9),输出满足下列条件的n=(i*103+j*102+10k+m):
n*9=(m*103+k*102+10j+i)
main()/*sj1-2-2*/
{inti,j,k,l,n;
for(n=1000;n<1111;n++)/*穷举四位数可能的值*/
{i=n/1000;j=n/100%10;k=n/10%10;l=n%10;
if(l*1000+k*100+j*10+i==n*9)
printf("Thenumbersatisfiedstatesconditionis:
%d\n",n);}
/*判断反序数是否是原整数的9倍若是则输出*/
}
2-3.口袋中有12个球,其中3红,3白和6黑,从中任取8个球,编程,输出所有不同的取法。
结果:
No.REDWHITEBLACK
------------------------
1:
026
2:
035
。
。
。
。
。
。
。
13:
332
分析:
设任取红球的个数为i,白球的个数为j,黑球的个数为k,据题意红球和白球个数的取值范围是0~3,黑球的取值范围是0~6。
所以用三重循环穷举红球、白球、黑球可能的值,输出满足条件(总数为8个球)的取法。
因为总数为8个球,所以黑球的个数为8-i-j(<=6),故可以省略k循环。
main()/*sj1-2-3*/
{inti,j,count=0;
printf("No.REDWHITEBLACK\n");
printf("-----------------------------\n");
for(i=0;i<=3;i++)/*循环控制变量i控制任取红球个数0~3*/
for(j=0;j<=3;j++)/*循环控制变量j控制任取白球个数0~3*/
if((8-i-j)<=6)
printf("%2d:
%d%d%d\n",++count,i,j,8-i-j);
}
2-4.小明有五本不同的新书,要借给A、B、C三位小朋友,每人每次只能借一本,编程,输出所有不同的借法。
结果:
No.ABC
1123
2124
……
60543
分析:
设5本书分别命名为1、2、3、4、5,A、B、C可以任取一本书,所以可以用A、B、C三重循环,取值范围:
从1到5。
A、B、C所借书互不相同(a!
=b&&a!
=c&&b!
=c)。
main()/*sj1-2-4*/
{inta,b,c,n=0;
printf("No.ABC\n");
printf("-------------------------\n");
for(a=1;a<=5;a++)/*循环变量a控制任取书1~5*/
for(b=1;b<=5;b++)/*循环变量b控制任取书1~5*/
{if(a==b)continue;
for(c=1;c<=5;c++)/*循环变量c控制任取书1~5*/
if(a!
=c&&b!
=c)
printf("%d%d%d\n",++n,a,b,c);
}
2-5.编程,求全部水仙花数。
所谓水仙花数是指一个三位数,其各位数字立方的和等于该数。
如:
153=13+53+33
结果:
153、370、371、407
分析:
对三位数i循环(i=100~999),将i的各位数字分解为a,b,c后,输出满足i=a3+b3+c3的i。
n位数i的各位数字(从高位到低位)分解方法:
i/k%10;k=10n-1,10n-2,…,102,10,1
main()/*sj1-2-5*/
{inti,a,b,c;
for(i=100;i<1000;i++)/*穷举要判定的数i的取值范围100~999*/
{a=i/100;/*截取整数i的百位数字*/
b=i/10%10;/*截取整数i的十位数字*/
c=i%10;/*截取整数i的个位数字*/
if(a*a*a+b*b*b+c*c*c==i)
printf("%d",i);/*若i是水仙花数,则输出*/
}
}
2-6.100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。
编程,输出所有满足条件的方案(即大、中、小马的数目)。
结果:
1:
l=2m=30s=68
2:
l=5m=25s=70
3:
l=8m=20s=72
4:
l=11m=15s=74
5:
l=14m=10s=76
6:
l=17m=5s=78
7:
l=20m=0s=80
分析:
大马l一匹驮3担,它至多l=100/3=33匹;中马m至多m=(100-3*l)/2匹;小马s=(100-l-m)匹.可以用l、m两重循环(l=0~33,m=0~(100-3*l)/2),输出满足3l+2m+s/2=100(s是2的倍数)的l、m、s。
main()/*sj1-2-6*/
{intl,m,s,j=0;
for(l=0;l<=33;l++)
for(m=0;m<=(100-3*l)/2;m++)
{s=100-l-m;
if(s%2==0&&3*l+2*m+s/2==100)
printf("%2d:
l=%2dm=%2ds=%2d\n",++j,l,m,s);
}
}
2-7.用一元人民币兑换成1分、2分和5分硬币,编程,输出所有不同的兑换方法及兑换方法个数。
结果:
No.1>>5:
02:
01:
100
No.2>>5:
02:
11:
98
……
No。
541>>5:
202:
01:
0
分析:
设f5,f2,f1分别表示5分、2分和1分的个数,f5<=20,f2<=(100-f5*5)/2;f1<=100-f5*5-f2*2。
可以用f5、f2两重循环(f5=0~20,f2=0~(100-f5*5)/2),输出所有不同的兑换方法.至于兑换方法个数可以设变量n计数并输出即可。
main()/*sj1-2-7*/
{intf1,f2,f5,count=0;
for(f5=0;f5<=20;f5++)
for(f2=0;f2<=(100-f5*5)/2;f2++)
{f1=100-f5*5-f2*2;
printf("No.%3d>>5:
%4d2:
%2d1:
%2d\n",++count,f5,f2,f1);
}
}
2-8.编程,从键盘输入1个人的工资(1000—9999之间的整数),计算给这个人发工资时,需面值100元,50元,20元,10元,5元,2元和1元的人民币各多少张?
输出总张数最少的10种方案。
结果:
输入2310
no.100502010521
123001000
223000200
323000121
423000113
523000105
623000050
723000042
823000034
923000026
1023000018
分析:
设工资为n,100元至多为f100=n/100张,
50元至多为f50=(n-f100*100)/50张
20元至多为f20=(n-f100*100-f50*50)/20张
10元至多为f10=(n-f100*100-f50*50-f20*20)/10张。
5元至多为f5=(n-f100*100-f50*50-f20*20-f10*10)/5张。
2元至多为f2=(n-f100*100-f50*50-f20*20-f10*10-f5*5)/2张。
1元至多为f1=(n-f100*100-f50*50-f20*20-f10*10-f5*5-f2*2)张。
大面值人民币用得越多,总张数越少,因此用f100,f50,…,f1共7重循环(各面值张数从大到小循环,如:
f100=n/100~1)。
输出前10个满足条件(工资=∑fi)的面值组合。
main()/*sj1-2-8*/
{intn,f1,f2,f5,f10,f20,f50,f100,count=0;
scanf(“%d”,&n);
printf(“no.100502010521\n”)
for(f100=n/100;f100>=0;f100--)
for(f50=(n-f100*100)/50;f50>=0;f50--)
for(f20=(n-f100*100-f50*50)/20;f20>=0;f20--)
for(f10=(n-f100*100-f50*50-f20*20)/10;f10>=0;f10--)
for(f5=(n-f100*100-f50*50-f20*20-f10*10)/5;f5>=0;f5--)
for(f2=(n-f100*100-f50*50-f20*20-f10*10-f5*5)/2;f2>=0;f2--)
{f1=n-f100*100-f50*50-f20*20-f10*10-f5*5-f2*2;
if(n==f100*100+f50*50+f20*20+f10*10+f5*5+f2*2+f1)
printf("%2d%6d%6d%6d%6d%6d%6d%6d\n",++count,f100,f50,f20,f10,f5,f2,f1);
}
}
2-9.编程,输出555555的约数中最大的三位数。
结果:
777
分析:
对三位数j循环(j=999~100),输出首次能整除555555的j(最大约数)。
main()/*sj1-2-9*/
{intj;
longn;/*使用长整型变量,以免超出整数的表示范围*/
printf("Pleaseinputnumber:
");
scanf("%ld",&n);
for(j=999;j>=100;j--)/*可能的取值范围在999到100之间,j从大到小*/
if(n%j==0)/*若能够整除j,则j是约数,输出结果*/
{printf("Themaxfactorwith3digitsin%ldis:
%d.\n",n,j);
break;/*控制退出循环*/
}
if(j<100)printf("%ldhasnotfactorwith3digits\n",n);
}
2-10.编程,输出所有个位数为6且能被31整除的五位数及其个数。
结果:
No.110106
No.210416
……
No.28999386
No.29099696
分析:
对5位数n循环10000~99999,输出满足条件n%10==6&&n%31==0的所有n.
main()/*sj1-2-10*/
{longn,j=0;
for(n=10000;n<=99999;n++)/*取值范围在10000到99999之间*/
if(n%10==6&&n%31==0)/*个位数为6且能被31整除*/
printf("No.%ld%ld\n",++j,n);
}
2-11.一辆卡车违犯交通规则,撞人逃跑。
现场三人目击事件,但都没记住车号,只记下车号的一些特征。
甲说:
牌照的前两位数字是相同的;乙说:
牌照的后两位数字是相同的;丙是位数学家,他说:
四位的车号刚好是一个整数的平方。
根据以上线索,编程,输出车号。
结果:
7744
分析:
用两重循环构造一个前两位数相同、后两位数相同且相互间又不同的整数i*1000+i*100+j*10+j,(其中i=1~9,j=0~9),然后再用循环(c=31~99,c的平方为4位数)判断该整数是否是c的平方。
main()/*sj1-2-11*/
{inti,j,k,c;
for(i=1;i<=9;i++)/*i:
车号前二位的取值*/
for(j=0;j<=9;j++)/*j:
车号后二位的取值*/
if(i!
=j)/*判断两位数字是否相异*/
{k=i*1000+i*100+j*10+j;/*计算出可能的整数*/
for(c=31;c<100;c++)/*31~99的平方为4位数*/
if(c*c==k)
printf("Lorry_No.is%d.\n",k);/*若是,打印结果*/
}
}
2-12.中国古代数学家张丘建在他的《算经》中提出了著名的“百钱百鸡问题”:
鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?
编程,输出所有可能的购买方案。
结果:
No.abc
102575
241878
381181
412484
分析:
设鸡翁a只,鸡母b只,鸡雏c只,则a+b+c=100,且5a+3b+c/3=100,即15a+9b+c=300,鸡翁至多买100/5=20只,鸡母至多买100/3=33,鸡雏买100-a-b只。
用两重循环(a=0~20,b=0~33)输出满足条件a+b+c==100和15*a+9*b+c==300的所有购买方案。
main()/*sj1-2-12*/
{inta,b,c,n=0;
printf("No.abc\n");
for(a=0;a<=20;a++)/*鸡翁只数取值*/
for(b=0;b<=33;b++)/*鸡母只数取值*/
{c=100-a-b;/*计算出鸡雏的只数*/
if(15*a+9*b+c==300)
printf("%2d%d%d%d\n",++n,a,b,c);/*打印结果*/
}
}
2-13.编程,输出1000到100000之间所有满足下列条件的所有整数及其个数:
整数的各位数字之和等于5。
结果:
11004
21013
31022
41031
。
。
。
。
。
。
10340100
10441000
10550000
分析:
对i循环(i=1000~100000),将i的各位数字分解为a,b,c,d,e,f后,输出满足各位数字之和等于5的i。
n位数i的各位数字(从高位到低位)分解方法:
i/k%10;k=10n-1,10n-2,…,102,10,1
main()/*sj1-2-13*/
{longi,a,b,c,d,e,f,n=0;
for(i=1000;i<=100000;i++)/*穷举要判定的数i的取值范围100~999*/
{a=i/100000;/*截取整数i的百位数字*/
b=i/10000%10;/*截取整数i的十位数字*/
c=i/1000%10;/*截取整数i的个位数字*/
d=i/100%10
e=i/10%10;
f=i%10;
if(a+b+c+d+e+f==5)
printf("%3ld%ld\n",++n,i);/*若i满足要求,则输出*/
}
}
2-14.编程,任意输入一个偶数n,请将它分解为两个素数之和。
输出形式为:
*=*+*
结果:
输入248,输出248=7+241。
输入561,无输出
分析:
对j=2,3,…n-1循环,则n为j和m=n-j之和,若j、m均是素数则输出。
main()/*sj1-2-14*/
{intj,k,n,m;
printf("Pleaseentern:
");
scanf("%d",&n);
for(j=2;j {for(k=2;k if(j%k==0)break;/*j能够被小于它的一个数整除就不是素数*/ if(k>=j)/*j是素数*/ {m=n-j; for(k=2;k if(m%k==0)break; if(k>=m)/*m也是素数,输出结果*/ {printf("%d=%d+%d\n",n,j,m);break;} } } 2-15.有一正整数等差数列,其前四项之和是26,前四项之积是880,编程,输出此数列的前四项。 结果: 25811 分析: 对a=1,2,…循环,对每个a,依次令公差k=1,2,…,输出满足下列条件的a,b=a+k,c=a+2k,d=a+3k: a+b+c+d==26&&a*b*b*d==880 main()/*sj1-2-15*/ {inta=1,b,c,d,f=0,k=1; while (1) {k=1; b=a+k;c=b+k;d=c+k; if(a+b+c+d>26||a*b*c*d>880)/*肯定不能满足*/ {printf("notfound! ! \n");break;} while (1)/*以不同的公差试探*/ {if(a+b+c+d>26||a*b*c*d>880)break;/*不可能满足*/ if(a+b+c+d==26&&a*b*c*d==880)/*找到*/ {printf("%5d%5d%5d%5d\n",a,b,c,d);f=1;break;} k++; b=a+k;c=b+k;d=c+k; } if(f==1)break; a++; } } 2-16.一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。 又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。 编程,输出这个自然数。 结果: 1993 分析: 对自然数1,2,。 。 。 搜索满足下列条件的数K: 对n=k/8;b=n/8;a=b/8;满足k%8==1&&n%8==1&&b%8==7,对c=k/17;d=n/17;满足(k%17==4&&c%17==15&&2*a==d) main()/*sj1-2-16*/ {intn,b,a,k=0; while(++k) {n=k/8;b=n/8;a=b/8; if(k%8! =1||n%8! =1||b%8! =7)continue; n=k/17;b=n/17; if(k%17! =4||n%17! =15)continue; if(2*a==b){printf("k=%d\n",k);break;} } } 2-17.如果一个数恰好等于它的因子之和,则称该数为“完全数”。 如: 6的因子是1、2、3,而6=1+2+3,则6是个“完全数”。 编程,输出1000以内的全部“完全数”。 结果: 1+2+3==6。 1+2+4+7+14==28 1+2+4+8+16+31+62+124+248==496 分析: 对i循环(i=1~1000),输出满足条件的i及其各因子(用a数组记录)。 main()/*sj1-2-17*/ {inti,j,m,s,k,a[100]; for(i=1;i<=1000;i++)/*寻找1000以内的完全数*/ {m=i;s=0;k=0; for(j=1;j if(m%j==0) {s=s+j; a[k++]=j; } if(i==s)/*I为各因子之和,输出*/ {for(j=0;j printf("%d+",a[j]); printf("\b==%d\n",i); } } } 2-18.一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码顺序正好相反,编程,输出这个三位数。 结果: 248(248=(503)7,248=(305)9) 分析: 3位7进制数的范围: (100)7=49,(666)7=342, 3位9进制数的范围: (100)9=81,(888)9=728 所以81~342的7、9进制数均为3位数。 对i循环(i=81~342),计算i的7、9进制数,输出它们数码顺序正好相反的i。 main()/*sj1-2-18*/ {inti,n,k,a[3],b[3]; for(i=81;i<=342;i++) {for(n=i,k=0;n>0;n/=7)/*化为7进制并存放到a*/ a[k++]=n%7; for(n=i,k=0;n>0;n/=9)/*化为9进制并存放到b*/ b[k++]=n%9; for(n=0;n if(a[n]! =b[k-n-1])break;/*非反序,n if(n==k)/*反序,n==k*/ printf("%d\n",i); } } 2-19.用40元买苹果、西瓜和梨共100个,3种水果都要。 已知苹果0.4元一个,西瓜4元一个,梨0.2元一个。 问可以各买多少个? 编程,输出全部购买方案。 分析: 设西瓜买x个,苹果买y个,梨买z个,则问题满足方程: 4x+0.4y+0.2z=40 x+y+z=100 即: 40x+4y+2z=400 x+y+z=100 西瓜至多买(40-0.4-0.2)/4=9个,苹果至多买(40-4-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北理工 语言