我们应该使用哪种数据类型来输入一个介于0 <= number&lt; = 10 ^ 18之间的数字

时间:2015-04-10 15:27:19

标签: c++

在下面的代码中,我得到运行时错误,我想输入一个介于0&lt; = a&lt; = 10 ^ 18之间的数字,a是数字,我们应该使用哪种数据类型来取这样的一个很大的数字,如10 ^ 18,帮助

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
main()
{
    int flag=1,cases;
    long int j,i;
    unsigned long long int a;
    cin>>a;
    if(a==0)
    {
        cout<<"yes";
    }
    else
    {
        unsigned long long int temp[a];
        temp[0]=0;
        cases=1;
        i=1;
        while(temp[i]!=a)
        {
            if(cases==1)
            temp[i]=temp[i-1]+1;
            else if(cases==2)
            temp[i]=temp[i-1]+2;
            else if(cases==3)
            temp[i]=temp[i-1]+3;
            cases++;
            if(cases>3)
            cases=1;
            i++;
        }
        for(j=0;j<i;j++)
        {
            if(temp[j]==a)
            {
                cout<<"yes";
                break;
            }
            if(j==i-1)
            flag=0;
        }
        if(flag==0)
        cout<<"no";
    }
}

3 个答案:

答案 0 :(得分:0)

您正在使用temp而不初始化它。你确实将第一个元素设置为零,然后开始从1开始迭代。更进一步,如何将任何索引的temp设为等于a?不太可能 - 所以你的时间不会终止。迟早会出现运行时错误。

尝试添加

temp[a-1] = a;

在while循环之前

或许你真的想要成为

while(i <a)

答案 1 :(得分:-2)

您已经使用了无符号long long int,这个值足够大,可用于18446744073709551615(2 ^ 64 - 1)或更高* http://www.cplusplus.com/reference/climits/

我的猜测是你的运行时错误是由不同于此的东西引起的。 但要小心使用可变长度数组。想想为阵列分配10 ^ 18个无符号long long int需要多少内存?假设它映射到64位类型:每*(10 ^ 18)8个字节是~7105 PetaBytes。

答案 2 :(得分:-2)

假设你使用的是unsigned long long int vector。

 vector<unsigned long long int> temp ;

如果你写cout<<temp.max_size();它会给你理论上可以根据你的机器管理多少元素((例如,如果你在RAM较大的计算机上写相同,它会给你另一个数字))当你运行程序时,它不知道实际可用的内存量。让我们说max_size()给我们一些数字,578910255011,所以假设你的a = 10 ^ 10,无符号长long = 8字节,( 10 ^ 10 * 8)/ 1024/1024/1024 = 9.31GB。所以你的RAM应该等于9.31Gb,这就是为什么它是运行时错误,因为RAM是运行程序使用的内存。因此,为了解决这个问题,你应该增加你的RAM,10 ^ 12无符号长长元素= 931Gb,并将花费一大笔钱:)(如果你的计算机甚至可以支持那么多)或使用类似STXXL的东西