nyy 发表于 2022-10-28 14:57:38

nyy 发表于 2022-10-28 14:31
我运行了我十年前写的程序,居然运行无误!但是要让我现在来读程序,我还真没耐心!

运行结果:


知道了答案,就可以用答案来搜索,看能不能找到好的解决办法,
搜索
7375428413
,可以找到相关链接
这儿是一个链接,但是只有结果
http://www.swtzw.cn/shuxue/2653.html

nyy 发表于 2022-10-28 15:26:14

我好奇:他的这个题目是怎么编出来的?
反正我是没能力编出这样的题目的!

nyy 发表于 2022-10-31 09:26:00

Clear["Global`*"];(*Clear all variables*)
(*生成所有可能的除数*)
aaa=Flatten@Table;
(*生成所有可能的商*)
bbb=Flatten@Table;
Do[
    cc=aa*bb;(*生成被除数*)
    ccd=IntegerDigits;(*得到各位上的数字*)
    If[(Length@ccd==10)&&(ccd[]==7),,Continue[]];(*符合条件再继续运算*)
    bbd=IntegerDigits;
    (*第1次除法开始*)
    b1=aa*bbd[];
    If!=6,Continue[]];
    (*第2次除法开始*)
    a2=(FromDigits@ccd[]-b1)*10+ccd[];
    a2d=IntegerDigits;If[(Length@a2d==7)&&(a2d[]==7),,Continue[]];(*符合条件再继续运算*)
    b2=aa*bbd[];
    If!=7,Continue[]];
    (*第3次除法开始*)
    a3=(a2-b2)*10+ccd[];
    a3d=IntegerDigits;If[(Length@a3d==6)&&(a3d[]==7),,Continue[]];(*符合条件再继续运算*)
    b3=aa*bbd[];
    b3d=IntegerDigits;If[(Length@b3d==6)&&(b3d[]==7),,Continue[]];(*符合条件再继续运算*)
    (*第4次除法开始*)
    a4=(a3-b3)*10+ccd[];
    If!=7,Continue[]];
    b4=aa*bbd[];
    b4d=IntegerDigits;If[(Length@b4d==7)&&(b4d[]==7),,Continue[]];(*符合条件再继续运算*)
    (*第5次除法开始*)
    a5=(a4-b4)*10+ccd[];
    If!=6,Continue[]];
    b5=aa*bbd[];
    If!=6,Continue[]];
    If];
    Print[{aa,bb,cc}]
,{aa,aaa},{bb,bbb}]


贴一个mathematica版本的代码,今早刚写的,代码应该不难读懂!
运行结果:
{125473,58781,7375428413}

nyy 发表于 2022-10-31 09:28:58

nyy 发表于 2022-10-31 09:26
贴一个mathematica版本的代码,今早刚写的,代码应该不难读懂!
运行结果:
{125473,58781,737542841 ...

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

nyy 发表于 2022-11-2 09:52:20

nyy 发表于 2022-10-31 09:26
贴一个mathematica版本的代码,今早刚写的,代码应该不难读懂!
运行结果:
{125473,58781,737542841 ...

给这段代码添加一张图片,以前的代码,没图片。同时,论坛首页的排版出现了不对齐的情况,
因此本人补充上这张图片,同时这个图片上标注了我写的代码的每个变量的意思。
方便理解mathematica代码

nyy 发表于 2022-11-2 09:56:56

https://easylearn.baidu.com/edu-page/tiangong/questiondetail?id=1730379798395762951&fr=search

百度这边有个详细的解答,但是我觉得还是我的代码清晰容易懂,重复的事情交给计算机去做!

ejsoon 发表于 2022-11-2 11:54:50

不錯,有才。

nyy 发表于 2022-11-2 13:46:47

中午搞了搞,写出了一个C语言的程序,但是程序依旧运行比较慢,大概七秒钟能得到运算结果。

代码如下:
//程序使用dev-c++ 4.9.9.2运行,Windows 7(64bit)操作系统,时间:2022年11月2日13:42:32
//解决问题:数学研发论坛:七个7问题 https://bbs.emath.ac.cn/forum.php?mod=viewthread&tid=73&fromuid=14149
#include <iostream>
using namespace std;

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

//主函数,通过除数与商的双重循环来解决问题,穷举法来解决问题,穷举并且不断判定
int main()
{
    long long aa;//除数
    long long bb;//商
    long long cc;//被除数
    for(aa=100070;aa<=999999LL;aa++)//除数循环,从小到大穷举
    {
      if(GetDigit(aa,2)!=7){continue;}//除数十位不是10则下一个循环
      for(bb=10700;bb<=99999LL;bb++)//商循环,从小到大穷举
      {
            if(GetDigit(bb,3)!=7){continue;}//商的百位必须是7
            cc=aa*bb;//通过乘法,得到被除数
            if(cc>=Power(10)){break;}//商太大了,所以中断本层循环!
            //开始第1次除法,并且检查位数与含有7的情况
            long long a1=(cc-cc%(10000LL))/(10000LL);//被除数去掉后四位
            long long b1=aa*GetDigit(bb,5);
            if(GetDigit(a1,4)!=7){continue;}//a1的倒数第4位必须是7
            if(CheckDigits(b1,6)!=1){continue;}//b1如果不是6位数,那么进行循环的下一个
            //开始第2次除法,并且检查位数与含有7的情况
            long long a2=(a1-b1)*10+GetDigit(cc,4);
            long long b2=aa*GetDigit(bb,4);
            if(GetDigit(a2,2)!=7){continue;}
            if(CheckDigits(a2,7)!=1){continue;}
            if(CheckDigits(b2,7)!=1){continue;}
            //开始第3次除法,并且检查位数与含有7的情况
            long long a3=(a2-b2)*10+GetDigit(cc,3);
            long long b3=aa*GetDigit(bb,3);
            if(GetDigit(a3,5)!=7){continue;}
            if(GetDigit(b3,5)!=7){continue;}
            if(CheckDigits(a3,6)!=1){continue;}
            if(CheckDigits(b3,6)!=1){continue;}
            //开始第4次除法,并且检查位数与含有7的情况
            long long a4=(a3-b3)*10+GetDigit(cc,2);
            long long b4=aa*GetDigit(bb,2);
            if(GetDigit(b4,3)!=7){continue;}
            if(CheckDigits(a4,7)!=1){continue;}
            if(CheckDigits(b4,7)!=1){continue;}
            //开始第5次除法,并且检查位数与含有7的情况
            long long a5=(a4-b4)*10+GetDigit(cc,1);
            long long b5=aa*GetDigit(bb,1);
            if(CheckDigits(a5,6)!=1){continue;}
            if(CheckDigits(b5,6)!=1){continue;}
            //最后的检查
            if(a5!=b5){continue;}//如果两者不相等,那么进行循环的下一次
            //输出最后的结果
            printf("%lld(除数)*%lld(商)=%lld(被除数)\n",aa,bb,cc);//输出格式一定要用%lld,不能用%d
      }
    }
    system("pause");
    return 0;
}

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

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

/*子函数,计算10的n次幂! pow函数我用不好,只好使用这种笨办法*/
long long Power(int n)//计算10的n次幂
{
    long long i=1LL;//默认返回值
    if   (n==0){
      i=1LL;}
    else if(n==1){
      i=10LL;}
    else if(n==2){
      i=100LL;}
    else if(n==3){
      i=1000LL;}
    else if(n==4){
      i=10000LL;}
    else if(n==5){
      i=100000LL;}
    else if(n==6){
      i=1000000LL;}
    else if(n==7){
      i=10000000LL;}
    else if(n==8){
      i=100000000LL;}
    else if(n==9){
      i=1000000000LL;}
    else if(n==10){
      i=10000000000LL;}
    else if(n==11){
      i=100000000000LL;}
    return i;
}


运行结果就不粘贴了!

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

nyy 发表于 2022-11-2 13:52:39

nyy 发表于 2022-11-2 13:46
中午搞了搞,写出了一个C语言的程序,但是程序依旧运行比较慢,大概七秒钟能得到运算结果。

代码如下:
...

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

原本以为c语言程序就能快很多,但是让我失望了。
但是通过这个题目,让我知道遇到比较大的整数应该如何办、
函数要跑到最前面先声明,然后再使用
让我知道了遇到很大的整数用%d是输出不来的。

nyy 发表于 2022-11-7 13:52:01

nyy 发表于 2022-11-2 13:46
中午搞了搞,写出了一个C语言的程序,但是程序依旧运行比较慢,大概七秒钟能得到运算结果。

代码如下:
...

说来把我写的C语言代码优化优化,要求尽可能地快!
页: 1 2 3 4 5 [6] 7
查看完整版本: 七个7问题