|
发表于 2024-8-2 10:24:13
From FishC Mobile
|
显示全部楼层
|阅读模式
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
最近了解到一个叫“雷劈数”的概念,就是一个数字被分为两半后相加,再平方,如果还等于原数字,就称他为雷劈数。如将81分为8、1,相加为9,平方仍为81,那么81就是雷劈数。
所以我就写了两个遍历雷劈数的程序,并遍历一亿以内的雷劈数,结果发现两个程序的运行耗时差别非常大:
程序1:
#include <stdio.h>
#include <math.h>
int Ndigit(int number)//取得数字的位数
{
int num=0;
do{
++num;
number=(int)number/10;
}while(number>0);
return ((num%2)==1)?(num-1):num;
}
int main(int argc, char **argv) {
int limit=0;
int dig=0,digs=0;
printf("请输入上限:\n");
scanf("%d",&limit);
for(int i=10;i<limit;++i){//遍历10~limit
dig=Ndigit(i);
for(int j=1,num1=0,num2=0;j<=dig;++j){//将数字分为两半(有不同分法)
num2=i%(int)(pow(10,j));
num1=(i-num2)/pow(10,j);
if(pow(num1+num2,2)==i){//如果是雷击数就输出
printf("%d:(%d+%d)^2\n",i,num1,num2);
}
}
}
return 0;
}
这个程序的运行效率是比较高的。
程序2:
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv) {
int limit=0;
int dig=0,digs=0;
printf("请输入上限:\n");
scanf("%d",&limit);
for(int i=10;i<limit;++i){//位数每+1,则dig+1
if((i%10)==0){
++dig;
}
for(int j=1,num1=0,num2=0;j<=dig;++j){
num2=i%(int)(pow(10,j));
num1=(i-num2)/pow(10,j);
if(pow(num1+num2,2)==i){
printf("%d:(%d+%d)^2\n",i,num1,num2);
}
}
}
return 0;
}
这个程序运行效率就很低了。
两个程序的差别就在于,第一个程序中的Ndigit函数(用于获得数字的位数),被我简化为
for(int i=10;i<limit;++i){//位数每+1,则dig+1
if((i%10)==0){
++dig;
}
后放入主函数内,为什么这两个程序运行效率差别这么大呢? |
|