将大数字分隔为数字c++

Separating big number to digits c++?

本文关键字:数字 c++ 分隔      更新时间:2023-10-16

我正在尝试将数字分隔为数字。由于我不想重新发明轮子,我正在使用互联网上现成的解决方案:

  int convert_to_digits(long long number,int n) 
   { 
    //n is the length of the number
    vector<int> digits(n, 0);
    while (number)
    {
        digits.push_back(number % 10);
        number /= 10;
    }
    reverse(digits.begin(), digits.end());

    for (int i=0;i<n;i++)
    {
    cout<<digits[i];
    }
    cout<<endl;
    return 0;}

适用于某些数字:

convert_to_digits(1234567890123456,16)

打印

    1234567890123456

但是:

convert_to_digits(1234567890123456789012,22)

突然打印

    9223372036854775807000

问题:

  1. 我做错了什么?如何解决?(我已经在使用longlong作为数字类型)

    1. 我看到了数字9223372036854775807的魔力,因为它是2^63−1,但为什么它会出现在这里

更新:这是对项目Euler问题8的解决方案的尝试,其中数字的长度限制为1000位。https://www.hackerrank.com/contests/projecteuler/challenges/euler008

首先,激活编译器的警告。在gcc和clang上,-Wall -Wextra -Werror起了作用。

其次,如果您在1234567890123456789012对于长时间来说太大的平台上调用convert_to_digits(1234567890123456789012,22),则会出现未定义的行为;由于1234567890123456789012是一个文字常量,编译器会警告您该错误。

最后,为什么不使用所有的std::类来完成您的肮脏工作呢?

#include <sstream>
#include <iostream>
int main()
{
    const unsigned long long ull = 1234567890123456;
    std::stringstream ss;
    ss << ull;
    const std::string digits = ss.str();
    for (std::string::size_type i = 0 ; i < digits.length() ; ++i)
    {
        std::cout << digits[i];
    }
    std::cout << std::endl;
    return 0;
}

编译&使用g++ -std=c++14 -O2 -Wall -Wextra -pedantic -pthread main.cpp && ./a.out运行输出:1234567890123456

Coliru的现场示例。

长-长类型的最大数是2^63-1,即幻数9223372036854775807。如果你比它更特别的数字,溢出!当您调用converttodigits()时,第一个参数不是您输入的值。

事实上,如果你需要这么大的数字,你应该写一个类来处理它。只需使用char*、数组或向量来存储这个大数字。并实现add、sub、mul、div和pow()