在下面的代码中,我得到运行时错误,我想输入一个介于0< = a< = 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";
}
}
答案 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的东西