找回密码
 欢迎注册
查看: 10454|回复: 7

[擂台] 七个7问题问题的编程解法

[复制链接]
发表于 2011-3-6 20:45:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
七个7问题见
http://bbs.emath.ac.cn/thread-73-1-1.html
现在要求使用编程的办法解决,要求求解的时间尽可能的短,
程序尽可能写的比较清晰.
可以使用mathematica\matlab之类的编程语言!


请管理员保留这个帖子,删除另外的那个重复的!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-3-6 20:47:05 | 显示全部楼层
实在不是我想发两遍!而是我的浏览器或者论坛反映太慢,以致于我以为自己没有把帖子发出去
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2012-4-26 14:05:46 | 显示全部楼层
/*此程序使用pari/gp运行*/
/*程序编制时间:2012年4月26日*/
GetDigits(n,d)=
{
    /*获得整数n从右向左数的第d位数字,
      比如GetDigits(7458,3)=4        */
    (n%10^d-n%10^(d-1))/10^(d-1)
}

{
    for(a=1,9,
        for(b=0,9,
            for(c=0,9,
                for(d=0,9,
                    for(e=0,9,
                        for(f=1,9,
                            for(g=0,9,
                                for(h=0,9,
                                    for(i=0,9,
                                        chushu=a*10^5+b*10^4+c*10^3+d*10^2+70+e;\\形成除数
                                        shang=f*10^4+g*10^3+700+h*10+i;\\形成商
                                        beichushu=chushu*shang;\\得到被除数,也就是两者的成绩
                                        if((beichushu<10^9)||(beichushu>10^10),next);\\如果被除数不是10位数,则继续下一个循环
                                        if(GetDigits(beichushu,8)!=7,next);\\如果被除数倒数第八位不是7,那么继续下一个循环
                                        x4=GetDigits(beichushu,4);\\得到被除数的千位
                                        x3=GetDigits(beichushu,3);\\得到被除数的百位
                                        x2=GetDigits(beichushu,2);\\得到被除数的十位
                                        x1=GetDigits(beichushu,1);\\得到被除数的个位
                                        num=(beichushu-beichushu%10000)/10000;\\被除数舍掉后四位
                                        \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                                        b0=chushu*f;
                                        if(b0<10^5||b0>10^6,next);
                                        \\第01次除法
                                        a1=num-chushu*f;
                                        if(a1<10^5||a1>10^6,next);
                                        if(GetDigits(a1,1)!=7,next);
                                        a12=a1*10+x4;
                                        \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                                        b1=chushu*g;
                                        if(b1<10^6||b0>10^7,next);
                                        \\第02次除法
                                        a2=a12-b1;
                                        if(a2<10^4||a2>10^5,next);
                                        if(GetDigits(a2,4)!=7,next);
                                        a22=a2*10+x3;
                                        \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                                        b2=chushu*7;
                                        if(b2<10^5||b2>10^6,next);
                                        \\第03次除法
                                        if(GetDigits(chushu*7,5)!=7,next);
                                        a3=a22-chushu*7;
                                        if(a3<10^5||a2>10^6,next);
                                        a32=a3*10+x2;
                                        \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
                                        b3=chushu*h;
                                        if(b3<10^6||b3>10^7,next);
                                        \\第04次除法
                                        if(GetDigits(chushu*h,3)!=7,next);
                                        a4=a32-chushu*h;
                                        if(a4<10^4||a2>10^5,next);
                                        a42=a4*10+x1;
                                        if((a42-chushu*i)!=0,next);
                                        \\结束上面的所有的操作,并且打印结果
                                        print([chushu,beichushu,shang])
                                        )
                                    )
                                )
                            )
                        )
                    )
                )
            )
        )
}



这是一个马虎的结果,其实我觉得代码还可以简单地优化一下,这样才更方便阅读!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2012-4-26 14:23:34 | 显示全部楼层
虽然能得到结果,但是运行的时间实在是太长了,连我自己都受不了了!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2012-4-26 15:48:57 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-6-4 09:34:39 | 显示全部楼层
3# mathematica


一年多后,自己写的代码自己都不怎么看明白了,这真是让人无语了!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2024-1-17 11:50:00 | 显示全部楼层
mathematica 发表于 2012-4-26 14:05
/*此程序使用pari/gp运行*/
/*程序编制时间:2012年4月26日*/
GetDigits(n,d)=

我现在自己都不明白为什么代码外面要加一层大括号,不加大括号都没办法运行!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-3-29 15:42 , Processed in 0.112112 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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