无法在C

时间:2016-01-05 11:39:38

标签: c time

我目前正在开展一个项目,在这个项目中我需要为给定的执行时间计算以下程序的最大输入。

程序就是这样。

#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编译器。

2 个答案:

答案 0 :(得分:3)

您正在比较intlong 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