【问题标题】:how to get large numbers as input?如何获得大数字作为输入?
【发布时间】:2019-08-04 09:14:01
【问题描述】:

嗨,我真的是 C++ 新手,我想编写一个代码,它接收来自用户的数字并将其数字相加,并一直这样做,直到它得到一个数字并返回它作为结果。但是我注意到当我的数字很大时(比如 15 位长),错误的数字会存储在我声明用于存储用户输入的变量中。我该怎么办?

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int get_sum(long x) {
    cout << x<<endl;
    if (x < 10) {
        return x;
    }
    else {
        string num_in_str = to_string(x);
        long result=0;
        for (int i = 0; i < num_in_str.size(); i++) {
            int digit = num_in_str[i] - '0';
            result += digit;
        }
        return get_sum(result);

    }
}
int main()
{
    long input;
    cin >> input;
    int final_result = get_sum(input);``
    cout << final_result;

}

【问题讨论】:

  • long long 应该这样做,如果您使用的是 64 位平台。
  • 为什么要满足于应该? int_least64_t from <cstdint> 会给你 64 位或死去尝试。
  • @user4581301,这只是一个糟糕的选择。 long long这样做,如果你在 64 位平台上。
  • @SidS 你有这个权利。从 C++11 开始,long long 保证 64 位,
  • 请注意,无论您选择何种整数数据类型,总和仍可能溢出。

标签: c++


【解决方案1】:

哦,我发现了。我不得不使用 uint64_t 数据类型

【讨论】:

  • 注意:它可能会存在,但uint64_t 是可选的。
【解决方案2】:

C++ 中的整数数据类型最多可以存储一定数量的数字。特别是,根据平台和编译器,“long”可以是 32 位或 64 位,最多可存储 2^31-1 或 2^63-1。如果您想处理任意精度的数字,我建议将每个输入读取为字符串,并逐个字符地处理它,如下所示:

#include <cctype>
#include <iostream>
#include <string>

int main()
{
    std::string s; 
    while (std::getline(std::cin, s)) {
        // parse string
        long sum = 0;
        for (std::size_t i = 0; i < s.length(); ++i) {
            if (std::isdigit(s[i]))
                sum += s[i] - '0';
            else
                break;
        }
        std::cout << sum << std::endl;
        if (sum < 10) break;
    }
    return 0;
}

【讨论】:

  • 小问题:long 至少为 32 位且不大于 long long 现在可能是 32 位或 64 位,但当 128 位 CPU 开始出现时,它可能是 128 或 256位。或者仍然是 32 位。疯了吧?
  • 如果您想要特定的确保长度,请包含 并使用 std::uint64_t 等类型之一。
猜你喜欢
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多