- 注册时间
- 2021-11-19
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 8645
- 在线时间
- 小时
|
发表于 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;
- }
复制代码
运行结果就不粘贴了!
有兴趣的可以改进一下程序,注释比较详细! |
|