CC语言趣味程序设计编程百例精解7.docx
《CC语言趣味程序设计编程百例精解7.docx》由会员分享,可在线阅读,更多相关《CC语言趣味程序设计编程百例精解7.docx(23页珍藏版)》请在冰豆网上搜索。
CC语言趣味程序设计编程百例精解7
C-C++语言趣味程序设计编程百例精解(7).txt蜜蜂整日忙碌,受到赞扬;蚊子不停奔波,人见人打。
多么忙不重要,为什么忙才重要。
61.1~9组成三个3位的平方数
将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不允许有重复数字,也不许同其它组的三个数字重复,要求每组中的三位数都组成一个平方数。
*问题分析与算法设计
本问题的思路很多,这里介绍一种简单快速的算法。
首先求出三位数中不包含0且是某个整数平方的三位数,这样的三位数是不多的。
然后将满足条件的三位数进行组合,使得所选出的3个三位数的9个数字没有重复。
程序中可以将寻找足条件的三位数的过程和对该三位数进行数字分解的过程结合起来。
*程序说明与注释
#include
intmain()
{
inta[20],num[20][3],b[10];/*a:
存放满足条件的三位数*/
/*若不是10的倍数,则分解三位数*/
/*分解该三位数中的每一个数字*/
inti,j,k,m,n,t,flag;
printf("The3squareswith3differentdigitseachare:
\n");
for(j=0,i=11;i<=31;i++)/*求出是平方数的三位数*/
if(i%10!
=0)/*若不是10的倍数,则分解三位数*/
{
k=i*i;/*分解该三位数中的每一个数字*/
num[j+1][0]=k/100;/*百位*/
num[j+1][1]=k/10%10;/*十位*/
num[j+1][2]=k%10;/*个位*/
if(!
(num[j+1][0]==num[j+1][1]||num[j+1][0]==num[j+1][2]||
num[j+1][1]==num[j+1][2]))/*若分解的三位数字均不相等*/
a[++j]=k;/*j:
计数器,统计已找到的满足要求的三位数*/
}
for(i=1;i<=j-2;++i)/*从满足条件的三位数中选出三个进行组合*/
{
b[1]=num[i][0];
b[2]=num[i][1];
b[3]=num[i][2];
for(t=i+1;t<=j-1;++t)
{
b[4]=num[t][0];/*取第t个数的三位数字*/
b[5]=num[t][1];
b[6]=num[t][2];
for(flag=0,m=1;!
flag&&m<=3;m++)/*flag:
出现数字重复的标记*/
for(n=4;!
flag&&n<=6;n++)/*判断两个数的数字是否有重复*/
if(b[m]==b[n])flag=1;/*flag=1:
数字有重复*/
if(!
flag)
for(k=t+1;k<=j;k++)
{
b[7]=num[k][0];/*取第k个数的三位数字*/
b[8]=num[k][1];
b[9]=num[k][2];
for(flag=0,m=1;!
flag&&m<=6;m++)/*判断前两个数字是否*/
for(n=7;!
flag&&n<=9;n++)/*与第三个数的数字重复*/
if(b[m]==b[n])flag=1;
if(!
flag)/*若均不重复则打印结果*/
printf("%d,%d,%d\n",a[i],a[t],a[k]);
}
}
}
}
*运行结果
The3squareswith3differentdigitseachare:
361,529,784
*思考题
将1、2、3、4、5、6、7、8、9九个数字分成二组,每个数字只能用一次,一组形成一个5位数,另一组形成一个4位数,使得前者为后者的n倍。
求所有满足条件的5位数和4位数。
(注意:
N的最大值等于68,68以内的某些N也是不可能的。
不可能的N值包括:
1、10、11、20、21、25、30、31等共32个。
)
62.由8个整数形成奇特的立方体
任意给出8个整数,将这8个整数分别放在一个立方体的八个顶点上,要求每个面上的四个数之和相等。
*问题分析与算法设计
简化问题:
将8个顶点对应数组中的8个元素,将“每个面上的四个数之和皆相等”转换为数组无素之间和的相等关系。
这里的关键在于正确地将立方体的8个顶点与数组的8个元素对应。
可以利用简单的穷举方法建立8个数的全部排列。
*程序说明与注释
#include
#include
intmain()
{
inta[9],ii=0,i,a1,a2,a3,a4,b1,b2,b3,b4,flag;
for(i=1;i<=8;i++)/*输入个数*/
{
printf("Pleaseenter[%d]number:
",i);
scanf("%d",&a[i]);
ii+=a[i];
}
printf("******************************************\n");
if(ii%2)/*和为奇数则输入的8个数不可用*/
{
printf("Sorrytheycan'tbeconstructedrequiredcube!
\n");
exit(0);
}
for(flag=0,a1=1;a1<=8;a1++)/*flag:
完成标记.flag=1;表示完成*/
for(a2=1;a2<=8;a2++)/*采用八重循环建立八个整数的全排列*/
if(a2!
=a1)/*前两个数不能相同*/
for(a3=1;a3<=8;a3++)
if(a3!
=a2&&a3!
=a1)/*前三个数不能相同*/
for(a4=1;a4<=8;a4++)
if(a4!
=a3&&a4!
=a2&&a4!
=a1)/*前四个数不能相同*/
for(b1=1;b1<=8;b1++)
if(b1!
=a4&&b1!
=a3&&b1!
=a2&&b1!
=a1)/*不能相同*/
for(b2=1;b2<=8;b2++)
if(b2!
=b1&&b2!
=a4&&b2!
=a3&&b2!
=a2&&b2!
=a1)
for(b3=1;b3<=8;b3++)
if(b3!
=b2&&b3!
=b1&&b3!
=a4&&b3!
=a3&&b3!
=a2&&b3!
=a1)
/*不能取相同的数*/
for(b4=1;b4<=8;b4++)
if(b4!
=b2&&b4!
=b1&&b4!
=b3&&b4!
=a4&&b4!
=a3&&b4!
=a2&&b4!
=a1)
if(a[b1]+a[b2]+a[b3]+a[b4]==ii/2
&&a[a1]+a[a2]+a[b1]+a[b2]==ii/2
&&a[a1]+a[a4]+a[b1]+a[b4]==ii/2)
{
flag=1;gotoout;/*满足条件则将flag置1后退出*/
}
out:
if(flag)
{
printf("Theycanbeconstructedrequiredcubeasfollow:
\n");
printf("/%2d…………/%2d\n",a[a4],a[a3]);
printf("%2d/…………%2d/|\n",a[a1],a[a2]);
printf("||||\n");
printf("||||\n");
printf("|%2d|||%2d\n",a[b4],a[b3]);
printf("/……………./\n");
printf("%2d/………….%2d/\n",a[b1],a[b2]);
}
elseprintf("Sorrytheycan'tbeconstructedrequiredcube!
\n");
}
*运行结果
Pleaseenter[1]number:
20
Pleaseenter[2]number:
45
Pleaseenter[3]number:
39
Pleaseenter[4]number:
25
Pleaseenter[5]number:
29
Pleaseenter[6]number:
7
Pleaseenter[7]number:
3
Pleaseenter[8]number:
2
Sorrytheycan'tbeconstructedrequiredcube!
*思考题
程序中建立全排列的方法效率太低,算法虽然简单但程序过于冗余。
请读者自行设计新的算法完成同样的工作。
63.减式还原
编写程序求解下式中各字母所代表的数字,不同的字母代表不同的数字。
PEAR
-ARA
——–
PEA
*问题分析与算法设计
类似的问题从计算机算法的角度来说是比较简单的,可以采用最常见的穷举方法解决。
程序中采用循环穷举每个字母所可能代表的数字,然后将字母代表的数字转换为相应的整数,代入算式后验证算式是否成立即可解决问题。
*程序说明与注释
#include
intmain()
{
intp,e,a,r;
for(p=1;p<=9;p++)/*从1到9穷举字母p的全部可能取值*/
for(e=0;e<=9;e++)/*从0到穷举字母e的全部可能取值*/
if(p!
=e)/*p不等于e*/
for(a=1;a<=9;a++)/*从0到9穷举字母a的全部可能取值*/
if(a!
=p&&a!
=e)
for(r=0;r<=9;r++)/*从0到9穷举字母r的全部可能取值*/
if(r!
=p&&r!
=e&&r!
=a&&p*1000+e*100+a*10+r-(a*100+r*10+a)
==p*100+e*10+a)
{
printf("PEAR%d%d%d%d\n",p,e,a,r);
printf("-ARA-%d%d%d\n",a,r,a);
printf("…………………….\n");
printf("PEA%d%d%d\n",p,e,a);
}
}
*运行结果
PEAR1098
-ARA-989
———-——
PEA109
*思考题
请复原下面的和式。
不同的字母代表不同的数字。
SEVEN8252482526
THREE1972219722
+TWO答案:
+106+104
———-———–———–
TWELVE102352102352
64.乘式还原
A代表数字0到9中的前五个数字,Z代表后五个数字,请还原下列乘式。
AZA
×AAZ
————
AAAA
AAZZ
ZAA
————
ZAZAA
*问题分析与算法设计
问题本身并不复杂,可以对乘式中的每一位使用穷举法,最终可以得到结果。
本题的关键在于怎样有效的判断每个部分积的每一位是否满足题意,这一问题处理不好,编写的程序会很长。
程序实现中采用了一个判断函数,通过传入函数的标志字符串对所有的数进行统一的判断处理。
*程序说明与注释
#include
voidprint(longa,longb,longs1,longs2,longs3);
intjud(longq,char*pflag);
intmain()
{
longi,j,k,l,m,n,term,t1,t2,t3;
intflag;
for(i=0;i<=4;++i)/*被乘数的第一位*/
for(j=5;j<=9;++