程序很简单。用户输入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的有趣答案的问题。
答案 0 :(得分:2)
主要问题是long long
的大小只有64位,因此最多只能容纳19位数。其最大值为9,223,372,036,854,775,807
。
如果只删除n=10
(对浮点类型而不是整数类型进行操作),则可以使代码正常工作到pow()
。对于第二次和后续循环迭代,您可以在添加new_val
之前将nums[i]
乘以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;
}
答案 1 :(得分:0)
请允许我建议针对此问题的不同方法。由于容器会让您无法容纳那些大数字,因此不要将它们作为数字,请尝试使用字符串:
从用户获取数字并将其存储在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,您只需在开头添加验证,而无需处理复杂的容器。