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

[分享] 七个7问题

  [复制链接]
发表于 2022-10-28 14:57:38 | 显示全部楼层
nyy 发表于 2022-10-28 14:31
我运行了我十年前写的程序,居然运行无误!但是要让我现在来读程序,我还真没耐心!

运行结果:

知道了答案,就可以用答案来搜索,看能不能找到好的解决办法,
搜索
7375428413
,可以找到相关链接
这儿是一个链接,但是只有结果
http://www.swtzw.cn/shuxue/2653.html
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-10-28 15:26:14 | 显示全部楼层
我好奇:他的这个题目是怎么编出来的?
反正我是没能力编出这样的题目的!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-10-31 09:26:00 | 显示全部楼层
  1. Clear["Global`*"];(*Clear all variables*)
  2. (*生成所有可能的除数*)
  3. aaa=Flatten@Table[i*100+70+j,{i,1000,1428},{j,0,9}];
  4. (*生成所有可能的商*)
  5. bbb=Flatten@Table[i*1000+700+j,{i,10,99},{j,00,99}];
  6. Do[
  7.     cc=aa*bb;(*生成被除数*)
  8.     ccd=IntegerDigits[cc];(*得到各位上的数字*)
  9.     If[(Length@ccd==10)&&(ccd[[3]]==7),,Continue[]];(*符合条件再继续运算*)
  10.     bbd=IntegerDigits[bb];
  11.     (*第1次除法开始*)
  12.     b1=aa*bbd[[1]];
  13.     If[Length@IntegerDigits[b1]!=6,Continue[]];
  14.     (*第2次除法开始*)
  15.     a2=(FromDigits@ccd[[1;;6]]-b1)*10+ccd[[7]];
  16.     a2d=IntegerDigits[a2];If[(Length@a2d==7)&&(a2d[[6]]==7),,Continue[]];(*符合条件再继续运算*)
  17.     b2=aa*bbd[[2]];
  18.     If[Length@IntegerDigits[b2]!=7,Continue[]];
  19.     (*第3次除法开始*)
  20.     a3=(a2-b2)*10+ccd[[8]];
  21.     a3d=IntegerDigits[a3];If[(Length@a3d==6)&&(a3d[[2]]==7),,Continue[]];(*符合条件再继续运算*)
  22.     b3=aa*bbd[[3]];
  23.     b3d=IntegerDigits[b3];If[(Length@b3d==6)&&(b3d[[2]]==7),,Continue[]];(*符合条件再继续运算*)
  24.     (*第4次除法开始*)
  25.     a4=(a3-b3)*10+ccd[[9]];
  26.     If[Length@IntegerDigits[a4]!=7,Continue[]];
  27.     b4=aa*bbd[[4]];
  28.     b4d=IntegerDigits[b4];If[(Length@b4d==7)&&(b4d[[5]]==7),,Continue[]];(*符合条件再继续运算*)
  29.     (*第5次除法开始*)
  30.     a5=(a4-b4)*10+ccd[[10]];
  31.     If[Length@IntegerDigits[a5]!=6,Continue[]];
  32.     b5=aa*bbd[[5]];
  33.     If[Length@IntegerDigits[b5]!=6,Continue[]];
  34.     If[a5-b5!=0,Continue[]];
  35.     Print[{aa,bb,cc}]
  36. ,{aa,aaa},{bb,bbb}]
复制代码


贴一个mathematica版本的代码,今早刚写的,代码应该不难读懂!
运行结果:
{125473,58781,7375428413}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-10-31 09:28:58 | 显示全部楼层
nyy 发表于 2022-10-31 09:26
贴一个mathematica版本的代码,今早刚写的,代码应该不难读懂!
运行结果:
{125473,58781,737542841 ...

如果能换上C语言的代码,估计能快上很多!

点评

nyy
这个代码没什么意思,因为没啥复杂的难度  发表于 2022-10-31 11:30
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-11-2 09:52:20 | 显示全部楼层
nyy 发表于 2022-10-31 09:26
贴一个mathematica版本的代码,今早刚写的,代码应该不难读懂!
运行结果:
{125473,58781,737542841 ...

给这段代码添加一张图片,以前的代码,没图片。同时,论坛首页的排版出现了不对齐的情况,
因此本人补充上这张图片,同时这个图片上标注了我写的代码的每个变量的意思。
方便理解mathematica代码
QQ截图20221102094906.jpg
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-11-2 09:56:56 | 显示全部楼层
https://easylearn.baidu.com/edu- ... 62951&fr=search

百度这边有个详细的解答,但是我觉得还是我的代码清晰容易懂,重复的事情交给计算机去做!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-11-2 11:54:50 | 显示全部楼层
不錯,有才。

点评

你是有個性。  发表于 2022-11-5 23:36
nyy
我就是有才!  发表于 2022-11-4 22:29
nyy
感觉你不常见,被你从中间插了一棍!  发表于 2022-11-2 14:29
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
回复

使用道具 举报

发表于 2022-11-2 13:46:47 | 显示全部楼层
中午搞了搞,写出了一个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.     for(aa=100070;aa<=999999LL;aa++)//除数循环,从小到大穷举
  16.     {
  17.         if(GetDigit(aa,2)!=7){continue;}//除数十位不是10则下一个循环
  18.         for(bb=10700;bb<=99999LL;bb++)//商循环,从小到大穷举
  19.         {
  20.             if(GetDigit(bb,3)!=7){continue;}//商的百位必须是7
  21.             cc=aa*bb;//通过乘法,得到被除数
  22.             if(cc>=Power(10)){break;}//商太大了,所以中断本层循环!
  23.             //开始第1次除法,并且检查位数与含有7的情况
  24.             long long a1=(cc-cc%(10000LL))/(10000LL);//被除数去掉后四位
  25.             long long b1=aa*GetDigit(bb,5);
  26.             if(GetDigit(a1,4)!=7){continue;}//a1的倒数第4位必须是7
  27.             if(CheckDigits(b1,6)!=1){continue;}//b1如果不是6位数,那么进行循环的下一个
  28.             //开始第2次除法,并且检查位数与含有7的情况
  29.             long long a2=(a1-b1)*10+GetDigit(cc,4);
  30.             long long b2=aa*GetDigit(bb,4);
  31.             if(GetDigit(a2,2)!=7){continue;}
  32.             if(CheckDigits(a2,7)!=1){continue;}
  33.             if(CheckDigits(b2,7)!=1){continue;}
  34.             //开始第3次除法,并且检查位数与含有7的情况
  35.             long long a3=(a2-b2)*10+GetDigit(cc,3);
  36.             long long b3=aa*GetDigit(bb,3);
  37.             if(GetDigit(a3,5)!=7){continue;}
  38.             if(GetDigit(b3,5)!=7){continue;}
  39.             if(CheckDigits(a3,6)!=1){continue;}
  40.             if(CheckDigits(b3,6)!=1){continue;}
  41.             //开始第4次除法,并且检查位数与含有7的情况
  42.             long long a4=(a3-b3)*10+GetDigit(cc,2);
  43.             long long b4=aa*GetDigit(bb,2);
  44.             if(GetDigit(b4,3)!=7){continue;}
  45.             if(CheckDigits(a4,7)!=1){continue;}
  46.             if(CheckDigits(b4,7)!=1){continue;}
  47.             //开始第5次除法,并且检查位数与含有7的情况
  48.             long long a5=(a4-b4)*10+GetDigit(cc,1);
  49.             long long b5=aa*GetDigit(bb,1);
  50.             if(CheckDigits(a5,6)!=1){continue;}
  51.             if(CheckDigits(b5,6)!=1){continue;}
  52.             //最后的检查
  53.             if(a5!=b5){continue;}//如果两者不相等,那么进行循环的下一次
  54.             //输出最后的结果
  55.             printf("%lld(除数)*%lld(商)=%lld(被除数)\n",aa,bb,cc);//输出格式一定要用%lld,不能用%d
  56.         }
  57.     }
  58.     system("pause");
  59.     return 0;
  60. }

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

  72. /*子函数,获得整数n从右向左数的第d位数字,比如GetDigit(7458,3)=4*/
  73. long long GetDigit(long long n,int d)
  74. {
  75.     long long i=Power(d);
  76.     long long k=Power(d-1);
  77.     long long a=(n%i-n%k)/k;//获取从右向左的第k个数字
  78.     return a;
  79. }

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


运行结果就不粘贴了!

有兴趣的可以改进一下程序,注释比较详细!

点评

nyy
程序写的真棒!我喜欢!  发表于 2023-3-20 13:45
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-11-2 13:52:39 | 显示全部楼层
nyy 发表于 2022-11-2 13:46
中午搞了搞,写出了一个C语言的程序,但是程序依旧运行比较慢,大概七秒钟能得到运算结果。

代码如下:
...

输出结果:
  1. 125473(除数)*58781(商)=7375428413(被除数)
  2. 请按任意键继续. . .
复制代码


原本以为c语言程序就能快很多,但是让我失望了。
但是通过这个题目,让我知道遇到比较大的整数应该如何办、
函数要跑到最前面先声明,然后再使用
让我知道了遇到很大的整数用%d是输出不来的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2022-11-7 13:52:01 | 显示全部楼层
nyy 发表于 2022-11-2 13:46
中午搞了搞,写出了一个C语言的程序,但是程序依旧运行比较慢,大概七秒钟能得到运算结果。

代码如下:
...

说来把我写的C语言代码优化优化,要求尽可能地快!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-19 08:17 , Processed in 0.046896 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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