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

which data type should we use for taking input a number which is in between 0<= number <= 10^18

本文关键字:lt 数字 之间 一个 数据类型 输入 我们      更新时间:2023-10-16

在下面的代码中,我遇到了运行时错误,我想输入一个介于 0<= a <= 10^18 之间的数字,一个是数字,以及我们应该使用哪种数据类型来获取像 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";
    }
}

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

尝试添加

temp[a-1] = a;

在 while 循环之前

或者,也许你真的希望这段时间

while(i <a)

您已经在使用无符号的长整型,它足够大,可以容纳 18446744073709551615 (2^64 - 1) 或更大*http://www.cplusplus.com/reference/climits/

我的猜测是您的运行时错误是由其他原因引起的。不过,要小心使用可变长度数组。想想为数组分配 10^18 个无符号长整 int 需要多少内存?假设它映射到 64 位类型:每 * (10^18) 8 个字节是 ~ 7105 PB。

假设您正在使用无符号长整形向量。

 vector<unsigned long long int> temp ;

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