大数字
Large digit numbers
程序很简单。用户输入 n
和 n
数量的数字,我尝试在相邻数字之间添加零。例如,如果用户输入 9(n
) 个数字作为 1 2 3 4 5 6 7 8 9(间隔开),程序输出 10203040506070809。该程序适用于最多 n=8 个数字,但我觉得很有趣n=9 位以上的答案。 n 的范围应该是 3<=n<=15
。我的程序如下:
int main()
{
cout << "\nEnter n and n values: \n";
int n;
cin >> n;
vector<long long>nums;
int en = n;
while (en > 0)
{
long long x;
cin >> x;
nums.push_back(x);
--en;
}
int r = 2 * n - 2;
long long new_val = 0;
int j = 0;
for (int i = 0; i < n; ++i)
{
new_val = new_val + nums[i] * (pow(10, r - j));
j += 2;
}
cout << new_val << endl;
}
我不知道如何解决从n=9到n=15的有趣答案问题。
主要问题是 long long
的大小仅为 64 位,因此最多只能容纳 19 位数字。它的最大值是9,223,372,036,854,775,807
.
如果您简单地删除 pow()
(它在浮点类型上运行,而不是整数类型),则可以使您的代码在 n=10
之前正常工作。对于第二次和后续循环迭代,您可以在添加 nums[i]
:
之前简单地将 new_val
乘以 100
#include <iostream>
#include <vector>
using namespace std;
int main()
{
cout << "\nEnter n and n values: \n";
int n;
cin >> n;
vector<long long> nums;
int en = n;
while (en > 0)
{
long long x;
cin >> x;
nums.push_back(x);
--en;
}
long long new_val = 0;
if (n > 0)
{
new_val = nums[0];
for (int i = 1; i < n; ++i)
{
new_val *= 100;
new_val += nums[i];
}
}
cout << new_val << endl;
}
但是1020304050607080901
是19位,所以n>=11
会溢出超过long long
的最大值。
对于如此高的值,您需要使用 BigNumber 库(因为大多数编译器还没有原生的 128 位数字类型)。或者,只需使用 std::string
而不是 long long
:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main()
{
cout << "\nEnter n and n values: \n";
int n;
cin >> n;
vector<int> nums;
int en = n;
while (en > 0)
{
int x;
cin >> x;
nums.push_back(x);
--en;
}
ostringstream new_val;
if (n > 0)
{
new_val << nums[0];
for (int i = 1; i < n; ++i)
new_val << '0' << nums[i];
}
cout << new_val.str() << endl;
}
请允许我提出解决此问题的不同方法。由于容器会给您带来麻烦,因此请不要将它们作为数字,而是尝试使用字符串:
从用户处获取数字并将其存储在 nums 向量中后,执行以下操作:
string output = "";
char temp;
for (int i = 0; i < nums.size(); i++){
temp = nums [i] + '0';
output += temp;
if (i != (nums.size()-1))
output += "0";
}
cout << output;
使用这种方法,用户可以输入任意大的数字。如果你希望数字从9到15,你可以简单地在开头添加验证,而不需要处理复杂的容器。
程序很简单。用户输入 n
和 n
数量的数字,我尝试在相邻数字之间添加零。例如,如果用户输入 9(n
) 个数字作为 1 2 3 4 5 6 7 8 9(间隔开),程序输出 10203040506070809。该程序适用于最多 n=8 个数字,但我觉得很有趣n=9 位以上的答案。 n 的范围应该是 3<=n<=15
。我的程序如下:
int main()
{
cout << "\nEnter n and n values: \n";
int n;
cin >> n;
vector<long long>nums;
int en = n;
while (en > 0)
{
long long x;
cin >> x;
nums.push_back(x);
--en;
}
int r = 2 * n - 2;
long long new_val = 0;
int j = 0;
for (int i = 0; i < n; ++i)
{
new_val = new_val + nums[i] * (pow(10, r - j));
j += 2;
}
cout << new_val << endl;
}
我不知道如何解决从n=9到n=15的有趣答案问题。
主要问题是 long long
的大小仅为 64 位,因此最多只能容纳 19 位数字。它的最大值是9,223,372,036,854,775,807
.
如果您简单地删除 pow()
(它在浮点类型上运行,而不是整数类型),则可以使您的代码在 n=10
之前正常工作。对于第二次和后续循环迭代,您可以在添加 nums[i]
:
new_val
乘以 100
#include <iostream>
#include <vector>
using namespace std;
int main()
{
cout << "\nEnter n and n values: \n";
int n;
cin >> n;
vector<long long> nums;
int en = n;
while (en > 0)
{
long long x;
cin >> x;
nums.push_back(x);
--en;
}
long long new_val = 0;
if (n > 0)
{
new_val = nums[0];
for (int i = 1; i < n; ++i)
{
new_val *= 100;
new_val += nums[i];
}
}
cout << new_val << endl;
}
但是1020304050607080901
是19位,所以n>=11
会溢出超过long long
的最大值。
对于如此高的值,您需要使用 BigNumber 库(因为大多数编译器还没有原生的 128 位数字类型)。或者,只需使用 std::string
而不是 long long
:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main()
{
cout << "\nEnter n and n values: \n";
int n;
cin >> n;
vector<int> nums;
int en = n;
while (en > 0)
{
int x;
cin >> x;
nums.push_back(x);
--en;
}
ostringstream new_val;
if (n > 0)
{
new_val << nums[0];
for (int i = 1; i < n; ++i)
new_val << '0' << nums[i];
}
cout << new_val.str() << endl;
}
请允许我提出解决此问题的不同方法。由于容器会给您带来麻烦,因此请不要将它们作为数字,而是尝试使用字符串:
从用户处获取数字并将其存储在 nums 向量中后,执行以下操作:
string output = "";
char temp;
for (int i = 0; i < nums.size(); i++){
temp = nums [i] + '0';
output += temp;
if (i != (nums.size()-1))
output += "0";
}
cout << output;
使用这种方法,用户可以输入任意大的数字。如果你希望数字从9到15,你可以简单地在开头添加验证,而不需要处理复杂的容器。