创建自己的整数类

时间:2018-12-19 10:21:14

标签: c++

我编写了一个函数,该函数在替换中查找数字并将它们以256为模进行求和。

__int64_t String_solver(string str){
    __int64_t i_a = 0;
    for(int i = 0 ; i < str.size(); i++){
        int j = 0;
        if(isdigit(str[i])){
            j=i;
            while(isdigit(str[i])){
                i++;
            }
            const char * c = str.substr (j,i-j).c_str();
            i_a+= strtoll(c, nullptr,10);
        }
        else if((str[i]=='-')&&(isdigit(str[i+1]))){
            j=i;
            i++;
            while(isdigit(str[i])){
                i++;
            }
            const char * c = str.substr (j,i-j).c_str();
            i_a+= strtoll(c, nullptr,10);
        }
    }
    return i_a;
}

int main() {
    __int64_t arg=0;
    string string1;
    std::ifstream in("text.txt");
    if (in.is_open())
    {
        while (getline(in, string1))
        {
            arg+=String_solver(string1);
        }
    }
    in.close();
    if(arg<0){
        cout << (arg % 256 + 256) % 256;
    }
    else{
        cout << arg%256;}
    return 0;
}

但是此程序不能正确使用以下文件 text.txt

12123
123123
123124234345
23423453465467345234
234234234234234
234234234234
-234234234234
-2134234234234287492847923847

我不明白为什么_int_64_t不是合适的类型。

2 个答案:

答案 0 :(得分:2)

  

我不明白为什么_int_64_t不是合适的类型。

如果您查看最大的价值,可以将其存储在_int64_t中: 2^64 = 18446744073709551616,您必须将其除以2,以便获得负值18446744073709551616/2 = 9223372036854775808。这意味着您可以获得的最大值为9223372036854775808,最小值为-9223372036854775808,但是最小值为-2134234234234287492847923847。这就是_int64_t不适合的原因。

也就是说,由于我们真的不知道您的输出出了什么问题,因此很难说这是否是真正的问题。

答案 1 :(得分:0)

如评论和第一个答案所述,您的输入类型不足以容纳大量的输入内容。

您只对最终的256模值感兴趣。因此,您可以一一读取数字并递归计算256模值,例如x = (10*x + newdigit) %256;

只需注意处理x的初恋标志即可。