【发布时间】:2019-11-01 16:35:56
【问题描述】:
我正在编写一个程序,它涉及的输入范围高达 100 万,当我使用数据类型“int”来处理我的值时,运行时间非常长,程序从未完全执行过,所以我没有能够记下运行时间。 之前的代码;
#include<stdio.h>
int main()
{
int n,m,i,maxt=0,maxn;
for(n=2;n<=1000000;n++){
m=n;
i=0;
for(i=0;m!=1;i++){
if(m%2==0)
m=m/2;
else
m=(3*m+1);
}
if(i>maxt){
maxt=i;
maxn=n;
}
}
printf("%d%d",maxn,maxt);
return 0;
}
但是在处理代码时,我将数据类型从“int”更改为“long long int”,令人惊讶的是,运行时间急剧下降(毫秒),谁能解释这背后的原因是什么? 后面的代码;
#include<stdio.h>
int main()
{
long long int n,m,i,maxt=0,maxn;
for(n=2;n<=1000000;n++){
m=n;
i=0;
for(i=0;m!=1;i++){
if(m%2==0)
m=m/2;
else
m=(3*m+1);
}
if(i>maxt){
maxt=i;
maxn=n;
}
}
printf("%lld%lld",maxn,maxt);
return 0;
}
【问题讨论】:
-
你能提供运行时间的确切数字吗?请包括您使用的编译器的版本,以及您可能使用的任何编译器标志。
-
@Apples 在第一种情况下运行时间非常长,即使等待超过 5 分钟,输出仍然没有计算出来。在第二种情况下,它需要几毫秒。我正在使用内置的 ubuntu 编译器。
-
您能强调一下这两个版本的不同之处吗?它们看起来和我一模一样,在这两种情况下都使用
long long int。 -
您是否使用相同的编译器标志编译两个代码示例?如此大的差异通常是由于错过了优化。您是否使用
-O2之类的优化标志进行编译? -
@Apples 根本没有