nyy
发表于 2022-11-8 09:03:01
nyy 发表于 2022-11-7 13:52
说来把我写的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;//被除数
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;
}
这个代码又比以前快了一点点!
Sansa
发表于 2023-3-19 22:45:07
111111111
nyy
发表于 2023-3-20 13:44:49
Sansa 发表于 2023-3-19 22:45
111111111
我怀疑你是个机器人!