北理工C语言2Word文档格式.docx
《北理工C语言2Word文档格式.docx》由会员分享,可在线阅读,更多相关《北理工C语言2Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
%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;
No.REDWHITEBLACK\n"
);
-----------------------------\n"
for(i=0;
i<
=3;
i++)/*循环控制变量i控制任取红球个数0~3*/
for(j=0;
j<
j++)/*循环控制变量j控制任取白球个数0~3*/
if((8-i-j)<
=6)
%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;
No.ABC\n"
-------------------------\n"
=5;
a++)/*循环变量a控制任取书1~5*/
for(b=1;
b++)/*循环变量b控制任取书1~5*/
{if(a==b)continue;
for(c=1;
c++)/*循环变量c控制任取书1~5*/
if(a!
=c)
++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;
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)
%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("
l=%2dm=%2ds=%2d\n"
++j,l,m,s);
2-7.用一元人民币兑换成1分、2分和5分硬币,编程,输出所有不同的兑换方法及兑换方法个数。
No.1>
>
5:
02:
01:
100
No.2>
11:
98
……
No。
541>
202:
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<
f2++)
{f1=100-f5*5-f2*2;
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>
f50--)
for(f20=(n-f100*100-f50*50)/20;
f20>
f20--)
for(f10=(n-f100*100-f50*50-f20*20)/10;
f10>
f10--)
for(f5=(n-f100*100-f50*50-f20*20-f10*10)/5;
f5>
f5--)
for(f2=(n-f100*100-f50*50-f20*20-f10*10-f5*5)/2;
f2>
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)
%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;
/*使用长整型变量,以免超出整数的表示范围*/
Pleaseinputnumber:
"
scanf("
%ld"
&
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整除*/
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;
=9;
i++)/*i:
车号前二位的取值*/
j++)/*j:
车号后二位的取值*/
if(i!
=j)/*判断两位数字是否相异*/
{k=i*1000+i*100+j*10+j;
/*计算出可能的整数*/
for(c=31;
100;
c++)/*31~99的平方为4位数*/
if(c*c==k)
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;
No.abc\n"
for(a=0;
a++)/*鸡翁只数取值*/
for(b=0;
b++)/*鸡母只数取值*/
{c=100-a-b;
/*计算出鸡雏的只数*/
if(15*a+9*b+c==300)
%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。
main()/*sj1-2-13*/
{longi,a,b,c,d,e,f,n=0;
for(i=1000;
=100000;
{a=i/100000;
b=i/10000%10;
c=i/1000%10;
d=i/100%10
e=i/10%10;
f=i%10;
if(a+b+c+d+e+f==5)
%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;
Pleaseentern:
%d"
&
for(j=2;
n;
j++)/*穷举法分解n为两个素数j和m之和*/
{for(k=2;
k<
j;
k++)/*检验j是否素数*/
if(j%k==0)break;
/*j能够被小于它的一个数整除就不是素数*/
if(k>
=j)/*j是素数*/
{m=n-j;
for(k=2;
m;
k++)/*检验m是否素数*/
if(m%k==0)break;
if(k>
=m)/*m也是素数,输出结果*/
{printf("
%d=%d+%d\n"
n,j,m);
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>
880)break;
/*不可能满足*/
if(a+b+c+d==26&
a*b*c*d==880)/*找到*/
%5d%5d%5d%5d\n"
a,b,c,d);
f=1;
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;
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);
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];
=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;
k;
%d+"
a[j]);
\b==%d\n"
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;
=342;
i++)
{for(n=i,k=0;
n>
0;
n/=7)/*化为7进制并存放到a*/
a[k++]=n%7;
for(n=i,k=0;
n/=9)/*化为9进制并存放到b*/
b[k++]=n%9;
for(n=0;
n++)/*检查两个三位数的数码顺序是否相反*/
if(a[n]!
=b[k-n-1])break;
/*非反序,n<
k*/
if(n==k)/*反序,n==k*/
%d\n"
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
西瓜至多买(40-0.4-0.2)/4=9个,苹果至多买(40-4-