打印本文 打印本文  关闭窗口 关闭窗口  
C趣味程序百例(21)除式还原(2)
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 13:59:10  文章录入:杜斌  责任编辑:杜斌

67.除式还原(2)
    下列除式中仅在商中给定了一个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


 
打印本文 打印本文  关闭窗口 关闭窗口