2017-01-13 27 views
0

好吧,我正在为学校做一个小项目,我找不到任何答案,为什么这个小小的代码改变使得它在任何时间完成时都没有时间编号m获取更高。看看变量“k”我将它从int更改为long。运行时差异使用不同数据类型的C++

我试图找到在在Collat​​z序列1至1000000

void lengstaRuna() { 

    cout << "Hæsta tala?:"; 
    int m; 
    cin >> m; 

    int lengstaRuna = 0; 
    int talaLengstuRunu = 0; 
    int k; 

    for(int i = 2; i < m; i++) { 
     int lengd = 1; 
     k = i; 

     while(k != 1) { 
      if(k % 2 == 0) { 
       k = k/2; 
      } else { 
       k = k*3 +1; 
      } 
      lengd++; 
     } 

     if(lengd > lengstaRuna) { 
      lengstaRuna = lengd; 
      talaLengstuRunu = i; 
     } 
    } 

    cout << "Lengsta runa: " << lengstaRuna << endl; 
    cout << "Tala lengstu runu: " << talaLengstuRunu << endl; 

} 



void lengstaRuna() { 

    cout << "Hæsta tala?:"; 
    int m; 
    cin >> m; 

    int lengstaRuna = 0; 
    int talaLengstuRunu = 0; 
    long k; 

    for(int i = 2; i < m; i++) { 
     int lengd = 1; 
     k = i; 

     while(k != 1) { 
      if(k % 2 == 0) { 
       k = k/2; 
      } else { 
       k = k*3 +1; 
      } 
      lengd++; 
     } 

     if(lengd > lengstaRuna) { 
      lengstaRuna = lengd; 
      talaLengstuRunu = i; 
     } 
    } 

    cout << "Lengsta runa: " << lengstaRuna << endl; 
    cout << "Tala lengstu runu: " << talaLengstuRunu << endl; 

} 

的问题是简单的最长序列:为什么它运行如此之快,当输入 ==百万?

+1

比什么快?从什么改变'm'? –

+0

这个程序的目标是什么? @Frosti –

+0

您可能想要添加更多平台详细信息。 C++标准只声明了sizeof(int)<=''sizeof(long)''等等。所以不知道你在处理什么,你不能指望深刻的见解。 – BitTickler

回答

0

我看到这里发生了什么。基本上,你的输入超过一定的值,因为你正在做k * 3,int会溢出。

我修改了你的代码来检查这个(见下文)。 Upto输入值大约为113000,'k'必须保持的最大值为1570824735(接近INT_MAX 2147483647)。任何114000或以上,'k'溢出,代码进入未知领域。当然,这个问题不会发生,当然你需要使用很长时间。

./a.out 113000 
j: 1570824735 
Lengsta runa: 354 
Tala lengstu runu: 106239 

#include <iostream> 
#include <string> 
using namespace std; 
void lengstaRuna(int m) { 


    int lengstaRuna = 0; 
    int talaLengstuRunu = 0; 
    int k; 
    long j = 0; 

    for(int i = 2; i < m; i++) { 
     int lengd = 1; 
     k = i; 

     while(k != 1) { 
      if(k % 2 == 0) { 
       k = k/2; 
      } else { 
       if (k*3 > j) 
        j = k*3; 
       k = k*3 +1; 
      } 
      lengd++; 
     } 

     if(lengd > lengstaRuna) { 
      lengstaRuna = lengd; 
      talaLengstuRunu = i; 
     } 
    } 
      cout << "j: " << j << endl; 

    cout << "Lengsta runa: " << lengstaRuna << endl; 
    cout << "Tala lengstu runu: " << talaLengstuRunu << endl; 

} 
int main (int ac, char** av) { 
    std::string::size_type sz; 
lengstaRuna(std::stoi(av[1])); 
}