找回密码
 欢迎注册
楼主: gxqcn

[分享] 七个7问题

  [复制链接]
发表于 2022-11-8 09:03:01 | 显示全部楼层
nyy 发表于 2022-11-7 13:52
说来把我写的C语言代码优化优化,要求尽可能地快!
  1. //程序使用dev-c++ 4.9.9.2运行,Windows 7(64bit)操作系统,时间:2022年11月2日13:42:32
  2. //解决问题:数学研发论坛:七个7问题 https://bbs.emath.ac.cn/forum.php?mod=viewthread&tid=73&fromuid=14149
  3. #include <iostream>
  4. using namespace std;

  5. //用到的子函数必须要先声明一下
  6. int CheckDigits(long long n,int d);
  7. long long GetDigit(long long n,int d);//从右向左的第d位数字
  8. long long Power(int n);//计算10的n次幂

  9. //主函数,通过除数与商的双重循环来解决问题,穷举法来解决问题,穷举并且不断判定
  10. int main()
  11. {
  12.     long long aa;//除数
  13.     long long bb;//商
  14.     long long cc;//被除数
  15.     int i1,i2,i3,i4;//用于得到除数与商的四个整数
  16.     for(i1=1000;i1<=9999;i1++)
  17.     {
  18.         for(i2=0;i2<=9;i2++)
  19.         {
  20.             aa=i1*100+70+i2;//形成除数
  21.             for(i3=10;i3<=99;i3++)
  22.             {
  23.                 for(i4=00;i4<=99;i4++)
  24.                 {
  25.                     bb=i3*1000+700+i4;//形成商
  26.                     cc=aa*bb;//通过乘法,得到被除数
  27.                     if(cc>=Power(10)){goto LABEL;}//商太大了,所以中断两层循环!
  28.                     //开始第1次除法,并且检查位数与含有7的情况
  29.                     long long a1=(cc-cc%(10000LL))/(10000LL);//被除数去掉后四位
  30.                     long long b1=aa*GetDigit(bb,5);
  31.                     if(GetDigit(a1,4)!=7){continue;}//a1的倒数第4位必须是7
  32.                     if(CheckDigits(b1,6)!=1){continue;}//b1如果不是6位数,那么进行循环的下一个
  33.                     //开始第2次除法,并且检查位数与含有7的情况
  34.                     long long a2=(a1-b1)*10+GetDigit(cc,4);
  35.                     long long b2=aa*GetDigit(bb,4);
  36.                     if(GetDigit(a2,2)!=7){continue;}
  37.                     if(CheckDigits(a2,7)!=1){continue;}
  38.                     if(CheckDigits(b2,7)!=1){continue;}
  39.                     //开始第3次除法,并且检查位数与含有7的情况
  40.                     long long a3=(a2-b2)*10+GetDigit(cc,3);
  41.                     long long b3=aa*GetDigit(bb,3);
  42.                     if(GetDigit(a3,5)!=7){continue;}
  43.                     if(GetDigit(b3,5)!=7){continue;}
  44.                     if(CheckDigits(a3,6)!=1){continue;}
  45.                     if(CheckDigits(b3,6)!=1){continue;}
  46.                     //开始第4次除法,并且检查位数与含有7的情况
  47.                     long long a4=(a3-b3)*10+GetDigit(cc,2);
  48.                     long long b4=aa*GetDigit(bb,2);
  49.                     if(GetDigit(b4,3)!=7){continue;}
  50.                     if(CheckDigits(a4,7)!=1){continue;}
  51.                     if(CheckDigits(b4,7)!=1){continue;}
  52.                     //开始第5次除法,并且检查位数与含有7的情况
  53.                     long long a5=(a4-b4)*10+GetDigit(cc,1);
  54.                     long long b5=aa*GetDigit(bb,1);
  55.                     if(CheckDigits(a5,6)!=1){continue;}
  56.                     if(CheckDigits(b5,6)!=1){continue;}
  57.                     //最后的检查
  58.                     if(a5!=b5){continue;}//如果两者不相等,那么进行循环的下一次
  59.                     //输出最后的结果
  60.                     printf("%lld(除数)*%lld(商)=%lld(被除数)\n",aa,bb,cc);//输出格式一定要用%lld,不能用%d
  61.                 }
  62.             }
  63.             LABEL:"你大爷商太大了";//跳过这个商,因为商太大了
  64.         }
  65.     }
  66.     system("pause");
  67.     return 0;
  68. }

  69. /*子函数,检查n是否是d位数,如果是,返回1,如果不是d位数,则返回0,
  70.   然后利用返回的a的值判定是否继续下一个循环*/
  71. int CheckDigits(long long n,int d)
  72. {
  73.     int a=0;
  74.     if((n>=Power(d-1))&&(n<Power(d)))
  75.     {
  76.         a=1;//等于1,这样返回值不用比较就是true,然后就能执行判定,然后运行
  77.     }
  78.     return a;
  79. }

  80. /*子函数,获得整数n从右向左数的第d位数字,比如GetDigit(7458,3)=4*/
  81. long long GetDigit(long long n,int d)
  82. {
  83.     long long i=Power(d);
  84.     long long k=Power(d-1);
  85.     long long a=(n%i-n%k)/k;//获取从右向左的第k个数字
  86.     return a;
  87. }

  88. /*子函数,计算10的n次幂! pow函数我用不好,只好使用这种笨办法*/
  89. long long Power(int n)//计算10的n次幂
  90. {
  91.     long long i=1LL;//默认返回值
  92.     if     (n==0){ i=1LL;}
  93.     else if(n==1){ i=10LL;}
  94.     else if(n==2){ i=100LL;}
  95.     else if(n==3){ i=1000LL;}
  96.     else if(n==4){ i=10000LL;}
  97.     else if(n==5){ i=100000LL;}
  98.     else if(n==6){ i=1000000LL;}
  99.     else if(n==7){ i=10000000LL;}
  100.     else if(n==8){ i=100000000LL;}
  101.     else if(n==9){ i=1000000000LL;}
  102.     else if(n==10){i=10000000000LL;}
  103.     else if(n==11){i=100000000000LL;}
  104.     return i;
  105. }
复制代码


这个代码又比以前快了一点点!

点评

nyy
程序有点小问题,应该跳出内部一层循环!  发表于 2022-11-8 09:05
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-3-19 22:45:07 | 显示全部楼层
111111111

评分

参与人数 1金币 +20 收起 理由
gxqcn + 20 首帖奖励,欢迎常来。

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
回复

使用道具 举报

发表于 2023-3-20 13:44:49 | 显示全部楼层

我怀疑你是个机器人!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-21 20:59 , Processed in 0.024826 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表