![]() ![]() |
|
C趣味程序百例(21)除式还原(2) | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 13:59:10 文章录入:杜斌 责任编辑:杜斌 | |
|
|
下列除式中仅在商中给定了一个7,其它打×的位置全部是任意数字,请还原。 ×7××× -------------商 ------------------ 除数 -------------------×××| ×××××××× -------------被除数 ×××× -------------1) --------------- ××× -------------2) ××× -------------3) --------------- ×××× -------------4) ××× -------------5) ----------------- ×××× -------------6) ×××× -------------7) ----------------- 0
*题目分析与算法设计 这道题是不可能用单纯的穷举法求解的,一则计算时间太长,二则难于求出除式中各部分的值。 对除式进行分析,改可能多地推出限制条件: 由3)可以看出,商的第二位7乘除数得一个三位数,所以除数<=142。 由除数乘商的第一位为一个四位数可知,商的第一位只能为8或9且除数>=112。同时商的第五位也为8或9数的前四位一定<=142*9+99且>=1000+10。 由4)、5)、6)可以看出,4)的前两位一定为“10”;5)的第一位一定为“9”;6)的前两位一定在10到99之间;商的第四位一定为为0。 由 5)的第一位一定是“9”和“112”<=除数<=142可知:商的第三位可能为7或8。 由除式本身可知:商的第四位为0。 由 1)可知:除数X商的第一位应当为一个四位数。 由 5)可知:除数X商的第三位应当为一个三位数。 编程时为了方便,将被除数分解:前四位用a[0]表示,第五位用a[1],第六位用a[2],第七八两位用a[3];除数用变量b表示;分解商:第一位用c[0],第五位用c[2];其它的部分商分别表示为:2)的前两位为d[0],4)的前三位为d[1],6)的前二位为d[2]。将上述分析用数学的方法综合起来可以表示为: 被除数: 1010<=a[0]<=1377 0<=a[1]<=9 0<=a[2]<=9 0<=a[3]<=99 除数: 112<=b <=142 商: 8<=c[0]<=9 7<=c[1]<=8 8<=c[2]<=9 2)的前两位: 10<=d[0]<=99 4)的前三位: 100<=d[1]<b 6)的前两位: 10<=d[2]<=99 1)式部分积: b*c[0]>1000 5)式部分积: 100<b*c[1]<1000 *程序与程序注释 #include<stdio.h> void main() { int a[4],b,c[3],d[4],i=1; for(a[0]=1010;a[0]<=1377;a[0]++) for(b=112;b<=142;b++) for(c[0]=8;c[0]<=9;c[0]++) if(b*c[0]>1000&&(d[0]=a[0]-b*c[0])>=10&&d[0]<100) for(a[1]=0;a[1]<=9;a[1]++) if((d[1]=d[0]*10+a[1]-b*7)>=100&&d[1]<b) for(a[2]=0;a[2]<=9;a[2]++) for(c[1]=7;c[1]<=8;c[1]++) if(b*c[1]<1000&&(d[2]=d[1]*10+a[2]-b*c[1])>=10&&d[2]<100) for(a[3]=0;a[3]<=99;a[3]++)
for(c[2]=8;c[2]<=9;c[2]++) if(d[2]*100+a[3]-b*c[2]==0) { printf("No%2d:",i++); printf("%d%d%d%d%d/",a[0],a[1],a[2],a[3]/10,a[3]%10); printf("%d=",b); printf("%d%d%d%d%d\n",c[0],7,c[1],0,c[2]); } } *运行结果: No 1:12128316/124=97809 *思考题 下列除式中“×”所在的位置全部是任意数字,请还原。 ××××× ------------------- ××× | ×××××××× ×××× ------------------ ×××× ××× --------------- ××× ××× ----------- ××××
×××× ----------- 0 |
|
![]() ![]() |