- 注册时间
- 2021-11-19
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 8641
- 在线时间
- 小时
|
发表于 2022-11-8 09:03:01
|
显示全部楼层
- //程序使用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;//被除数
- int i1,i2,i3,i4;//用于得到除数与商的四个整数
- for(i1=1000;i1<=9999;i1++)
- {
- for(i2=0;i2<=9;i2++)
- {
- aa=i1*100+70+i2;//形成除数
- for(i3=10;i3<=99;i3++)
- {
- for(i4=00;i4<=99;i4++)
- {
- bb=i3*1000+700+i4;//形成商
- cc=aa*bb;//通过乘法,得到被除数
- if(cc>=Power(10)){goto LABEL;}//商太大了,所以中断两层循环!
- //开始第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
- }
- }
- LABEL:"你大爷商太大了";//跳过这个商,因为商太大了
- }
- }
- 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;
- }
复制代码
这个代码又比以前快了一点点! |
|