三个人分到的东西。其中每个人对应数组a的一行,数组的第0列放分到的鱼的整筐数,数组的第1列放分到的半筐数,数组的第2列放分到的空筐数。由题目可以推出: 。数组的每行或每列的元素之和都为7; 。对数组的行来说,满筐数加半筐数=3.5; 。每个人所得的满筐数不能超过3筐;
。每个人都必须至少有1 个半筐,且半筐数一定为奇数
对于找到的某种分鱼方案,三个人谁拿哪一份都是相同的,为了避免出现重复的分配方案,可以规定:第二个人的满筐数等于第一个人的满筐数;第二个人的半筐数大于等于第一个人的半筐数。 *程序说明与注释 #include
int i,j,k,m,n,flag;
printf(\
for(i=0;i<=3;i++) /*试探第一个人满筐a[0][0]的值,满筐数不能>3*/ {
a[0][0]=i;
for(j=i;j<=7-i&&j<=3;j++) /*试探第二个人满筐a[1][0]的值,满筐数不能>3*/ {
a[1][0]=j;
if((a[2][0]=7-j-a[0][0])>3)continue; /*第三个人满筐数不能>3*/
if(a[2][0]=前一个人,以排除重复情况*/ for(k=1;k<=5;k+=2) /*试探半筐a[0][1]的值,半筐数为奇数*/ {
a[0][1]=k;
for(m=1;m<7-k;m+=2) /*试探 半筐a[1][1]的值,半筐数为奇数*/ {
a[1][1]=m; a[2][1]=7-k-m;
for(flag=1,n=0;flag&&n<3;n++)
/*判断每个人分到的鱼是 3.5筐,flag为满足题意的标记变量*/ if(a[n][0]+a[n][1]<7&&a[n][0]*2+a[n][1]==7) a[n][2]=7-a[n][0]-a[n][1]; /*计算应得到的空筐数量*/ else flag=0; /*不符合题意则置标记为0*/ if(flag) {
printf(\–basket Empty\\n\for(n=0;n<3;n++)
printf(\'A'+n,a[n][0],a[n][1],a[n][2]); } } }
} } }
* 运行结果
It exists possible distribution plans: No.1 Full basket Semi–basket Empty fisher A: 1 5 1 fisher B: 3 1 3 fisher C: 3 1 3
No.2 Full basket Semi–basket Empty fisher A: 2 3 2 fisher B: 2 3 2 fisher C: 3 1 3 *思考题
晏会上数学家出了一道难题:假定桌子上有三瓶啤酒,癣瓶子中的酒分给几个人喝,但喝各瓶酒的人数是不一样的。不过其中有一个人喝了每一瓶中的酒,且加起来刚好是一瓶,请问喝这三瓶酒的各有多少人?
(答案:喝三瓶酒的人数分别是2人、3人和6人)
18.有限5位数
个位数为6且能被3整除的五位数共有多少? *题目分析与算法设计
根据题意可知,满足条件的五位数的选择范围是10006、10016。。。99996。可设基础数i=1000,通过计算i*10+6即可得到欲选的数(i的变化范围是1000~999),再判断该数能否被3整除。 *程序说明与注释 #include
long int i;
int count=0; /*count:统计满足条件的五位数的个数*/ for(i=1000;i<9999;i++)
if(!((i*10+6)%3)) /*判断所选的数能否被3整除*/ count++; /*若满足条件则计数*/ printf(\}
*运行结果 count=2999
*思考题
求100到1000之间有多少个其数字之和为5的整数。
(答案:104,113,122,131,140,203,212,221,230,302,311,320,401,410,500) 19.8除不尽的自然数
一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。求这个自然数。 *问题分析与算法设计
根据题意,可设最后的商为i(i从0开始取值),用逆推法可以列出关系式: (((i*8+7)*8)+1)*8+1=((2*i*17)+15)*18+4 再用试探法求出商i的值。 *程序说明与注释 #include
for(i=0;;i++) /*试探商的值*/
if(((i*8+7)*8+1)*8+1==(34*i+15)*17+4) { /*逆推判断所取得的当前i值是否满足关系式*/ /*若满足则输出结果*/
printf(\break; /*退出循环*/ } }
*运行结果
The required number is:1993 20.一个奇异的三位数
一个自然数的七进制表达式是一个三位数,而这个自然数的九进制表示也是一个三位数,且这两个三位数的数码正好相反,求这个三位数。 *问题分析与算法设计
根据题意可知,七进制和九进制表示的这全自然数的每一位一定小于7,可设其七进制数形式为kji(i、j、k的取值分别为1~6),然后设其九进制表示形式为ijk。 *程序说明与注释 #include
for(i=1;i<7;i++)
for(j=0;j<7;j++) for(k=1;k<7;k++)
if(i*9*9+j*9+k==i+j*7+k*7*7) {
printf(\
printf(\} }
*运行结果
The special number with 3 digits is:503(7)=305(9)=248(10)
C/C++语言经典、实用、趣味程序设计编程百例精解(3)
21.位反序数
设N是一个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来形成的整数。例如:1234的反序数是4321。 *问题分析与算法设计
可设整数N的千、百、十、个位为i、j、k、l,其取值均为0~9,则满足关系式: (i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i) 的i、j、k、l即构成N。 *程序说明与注释 #include
for(i=1002;i<1111;i++) /*穷举四位数可能的值*/
if(i*1000+i/10*100+i/100*10+i/1000==i*9) /*判断反序数是否是原整数的9倍*/
printf(\/*若是则输出*/ }
*运行结果
The number satisfied states condition is:1089 22.求车速
一辆以固定速度行驶的汽车,司机在上午10点看到里程表上的读数是一个对称数(即这个数从左向右读和从右向左读是完全一样的),为95859。两小时后里程表上出现了一个新的对称数。问该车的速度是多少?新的对称数是多少? *问题分析与算法设计
根据题意,设所求对称数为i,其初值为95589,对其依次递增取值,将i值的每一位分解后与其对称位置上的数进行比较,若每个对称位置上的数皆相等,则可判定i即为所求的对称数。
*程序说明与注释 #include
int t,a[5]; /*数组a存放分解的数字位*/ long int k,i;
for(i=95860;;i++) /*以95860为初值,循环试探*/ {
for(t=0,k=100000;k>=10;t++) /*从高到低分解所取i值的每位数*/ { /* 字,依次存放于a[0]~a[5]中*/ a[t]=(i%k)/(k/10); k/=10; }
if((a[0]==a[4])&&(a[1]==a[3])) {
printf(\a[0],a[1],a[2],a[3],a[4]);
printf(\break; } } }
*运行结果
The new symmetrical number kelometers is:95959. The velocity of the car is:50.00 *思考题
将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。求不超过1993的最大的二进制的对称数。
23.由两个平方三位数获得三个平方二位数
已知两个平方三位数abc和xyz,其中a、b、c、x、y、z未必是不同的;而ax、by、cz是三个平方二位数。请编程求三位数abc和xyz。 *问题分析与算法设计
任取两个平方三位数n和n1,将n从高向低分解为a、b、c,将n1从高到低分解为x、y、z。判断ax、by、cz是否均为完全平方数。 *程序说明与注释 #include