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语言代码优化优化,要求尽可能地快!