我目前正在开展一个项目,在这个项目中我需要为给定的执行时间计算以下程序的最大输入。
程序就是这样。
#include <stdio.h>
#include <math.h>
#include <time.h>
int main()
{
long long int n = 0;
int a0 = 0, a1 = 1, s = 0, i = 0, T = 0, j = 0;
scanf("%lld", &n);
clock_t start, end;
double timtaken;
start = clock();
for(j = 1 ; j <= n ; j++)
{
s = (a1 + a0) % 2014;
a0 = a1 % 2014;
a1 = s;
}
a1 = 1;
a0 = 0;
end = clock();
timtaken = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("time taken is %.9f\n", timtaken);
return 0;
}
问题没有给出任何编译错误,并且在输入2x10 9 之前工作正常。
任何大于此的输入编译器都会花费太多时间但不提供输出
在我的电脑中,2x10 9 的输出大约是18秒
我不明白为什么会发生这种情况
我已经通过MinGW安装了C编译器。
答案 0 :(得分:3)
您正在比较int
和long long int
。它们有不同的范围。
如果long long int
值超出int
范围,则所有投注均已关闭!
for (j = 1; j <= n; j++)
比较j <= n
容易出错
j
首先转换为long long int
,然后进行比较
之后,当j
恢复为int
时,会增加并溢出调用未定义的行为(可能会回到其范围的开头:-2,147,483,648
)。
使j
也成为long long int
个对象。
我想您计算机上int
的范围不会超过2,147,483,647
(或2.1x10^9
)。
答案 1 :(得分:0)
建议编写这样的代码,因为它非常人性化并且包含错误检查并且不限制循环计数器:
注意:主要问题是循环计数器j
限制为2gig,但n
不是。
#include <stdio.h>
#include <math.h>
#include <time.h>
int main( void )
{
unsigned long long int n;
int a0=0;
int a1=1;
int s=0;
//int i=0;
//int T=0;
//int j=0;
unsigned long long int j;
// note: format string: unsigned and leading space to consume white space
if( 1 != scanf(" %llu",&n) )
{ // then scanf failed
perror( "scanf failed" );
exit( EXIT_FAILURE );
}
// implied else, scanf successful
clock_t start;
clock_t end;
double timtaken;
// Note: 'n' already initialized by call to scanf()
for( ; n>0; n-- )
{
start=clock();
for( j=0; j<n; j++ )
{
s=(a1+a0)%2014;
a0=a1%2014;
a1=s;
}
a1=1;
a0=0;
end=clock();
timtaken=((double)(end-start))/CLOCKS_PER_SEC;
printf( "time taken is %.9f\n", timtaken );
if( 1 != scanf(" %llu",&n) )
{ // then scanf failed
perror( "scanf failed" );
exit( EXIT_FAILURE );
}
}
return 0;
} // end function: main