使用不同数据类型的运行时C ++的差异

时间:2017-01-13 19:13:03

标签: c++ long-integer type-conversion

好的,所以我正在为学校做一个小项目,我无法找到答案,为什么代码中的这一小改变使得它在数字 m 变得更高时立即完成。看看变量" k "我将它从int更改为long。

我试图在1到1000000之间找到Collat​​z序列中最长的序列

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;

}

问题很简单:输入 m == 1000000时为什么运行得更快?

1 个答案:

答案 0 :(得分:0)

我知道这里发生了什么。基本上,在输入的某个值之上,int正在溢出,因为你正在做k * 3。

我修改了你的代码来检查这个(见下文)。最高输入值约为113000,最大值为&#39; k&#39;必须持有的是1570824735(接近INT_MAX 2147483647)。任何114000或以上,&#39; k&#39;溢出,代码进入未知领域。当你长期使用时,这个问题不会发生。

./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]));
}