2017-01-13 54 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])); 
}