除法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>

int 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(0 == d[2]*100 + a[3] - b*c[2])
                      {
                          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", c[0], 7, c[1], 0, c[2]);
                      }
     printf("\n");

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值