2017-01-13 5 views
0

私は学校向けの小さなプロジェクトを行っていましたが、この小さなコードの変更によって、数字がmになると、高い。変数 "k"を見てください。intからlongに変更しました。ランタイムの相違点C++で異なるデータ型を使用

私は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; 

} 

質問はシンプルである間このCollat​​zシーケンスの中で最も長いシーケンスを見つけようとしている:それはなぜそんなに速く実行しない場合、入力メートル == 1000000?

+1

もっと速いですか? 'm'を何から変更しますか? –

+0

このプログラムの目標は何ですか? @Frosti –

+0

プラットフォームの詳細を追加したい場合があります。 C++標準では '' sizeof(int)<= '' sizeof(long) ''などしか書かれていませんので、あなたが扱っていることを知らずに深い洞察を期待することはできません。 – BitTickler

答えて

0

ここで何が起こっているのか分かります。基本的に、あなたの入力値の上に、k * 3を行っているのでintがオーバーフローしています。

これをチェックするようにコードを修正しました(下記参照)。最大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])); 
}