将大数字分隔为数字c++
Separating big number to digits c++?
我正在尝试将数字分隔为数字。由于我不想重新发明轮子,我正在使用互联网上现成的解决方案:
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
问题:
我做错了什么?如何解决?(我已经在使用longlong作为数字类型)
- 我看到了数字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()
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在将数字随机生成为数组期间从内存输出随机数的数组