如何通过 C++ 从数字列表中生成 3 位数字?
How to generate number with 3 digit from list of number by c++?
我是一名新程序员,想从数字列表 (2,5,8) 中生成 3 位数字的数组。我已经创建了一个代码,但输出不是我预期的结果。这是我的简单代码:
int main()
{
int arr[3]={2,5,8};
int d=3;
int times=1;
for (int a:arr){
int sum = a;
for (int i=1; i<d; i++){
times *= 10;
sum += a*times;
}
cout<<sum<<endl;
sum=0;
}
return 0;
}
我期望的结果是 222,555 和 888,但实际输出是 222,55005 和 8800008。
可能会有帮助。您忘记重置 times
变量
int main()
{
int arr[3]={2,5,8};
int d=3;
int times=1;
for (int a:arr){
int sum = a;
for (int i=1; i<d; i++){
times *= 10;
sum += a*times;
}
cout<<sum<<endl;
times = 1; //<---added
sum=0;
}
return 0;
}
使用 std::stringstream
它变得微不足道:
#include <sstream>
#include <iostream>
int main()
{
std::stringstream ss;
ss << 2 << 5 << 8;
int result{};
ss >> result;
std::cout << result << std::endl;
}
更新:
要使排列成为算法的一部分,您可以使用 std::next_permutation
:
std::string s("258");
do {
std::cout << s << '\n';
} while(std::next_permutation(s.begin(), s.end()));
对于您当前生成 222、555、888 的代码,您忘记重新初始化 times
。
您可能已经创建了一个子函数来进行说明:
int mul_by_111(int n) // { return 111 * n; }
{
int sum = a;
int times = 1;
for (int i = 1; i < 3; ++i) {
times *= 10;
sum += a * times;
}
return sum;
}
int main()
{
int arr[] = {2, 5, 8};
for (int a:arr){
std::cout << mul_by_111(a) << std::endl;
}
}
如果你想让笛卡尔积显示222, 225, 228, 522, .., 888
你可以(天真地)用 3 个循环来做:
int main()
{
int arr[] = {2, 5, 8};
for (int a:arr){
for (int b:arr){
for (int c:arr){
std::cout << a << b << c << std::endl;
}
}
}
}
一些库 range-v3 提议 cartesian_product
允许更简单:
for (auto t : ranges::view::cartesian_product(arr, arr, arr)) {
std::cout << std::get<0>(t) << std::get<1>(t) << std::get<2>(t) << std::endl;
// std::apply([](auto... args){ (std::cout << ... << args) << std::endl; }, t); // C++17
}
问题在于变量的范围。只需将它们放在块中,一切都很好:
int main()
{
int arr[3]={2,5,8};
int d=3;
for (int a:arr){
int sum = a;
int times=1;
for (int i=1; i<d; i++){
times *= 10;
sum += a*times;
}
cout<<sum<<endl;
}
return 0;
}
变量 sum 和 times 将在块输入时初始化。无需重置它们。
我是一名新程序员,想从数字列表 (2,5,8) 中生成 3 位数字的数组。我已经创建了一个代码,但输出不是我预期的结果。这是我的简单代码:
int main()
{
int arr[3]={2,5,8};
int d=3;
int times=1;
for (int a:arr){
int sum = a;
for (int i=1; i<d; i++){
times *= 10;
sum += a*times;
}
cout<<sum<<endl;
sum=0;
}
return 0;
}
我期望的结果是 222,555 和 888,但实际输出是 222,55005 和 8800008。
可能会有帮助。您忘记重置 times
变量
int main()
{
int arr[3]={2,5,8};
int d=3;
int times=1;
for (int a:arr){
int sum = a;
for (int i=1; i<d; i++){
times *= 10;
sum += a*times;
}
cout<<sum<<endl;
times = 1; //<---added
sum=0;
}
return 0;
}
使用 std::stringstream
它变得微不足道:
#include <sstream>
#include <iostream>
int main()
{
std::stringstream ss;
ss << 2 << 5 << 8;
int result{};
ss >> result;
std::cout << result << std::endl;
}
更新:
要使排列成为算法的一部分,您可以使用 std::next_permutation
:
std::string s("258");
do {
std::cout << s << '\n';
} while(std::next_permutation(s.begin(), s.end()));
对于您当前生成 222、555、888 的代码,您忘记重新初始化 times
。
您可能已经创建了一个子函数来进行说明:
int mul_by_111(int n) // { return 111 * n; }
{
int sum = a;
int times = 1;
for (int i = 1; i < 3; ++i) {
times *= 10;
sum += a * times;
}
return sum;
}
int main()
{
int arr[] = {2, 5, 8};
for (int a:arr){
std::cout << mul_by_111(a) << std::endl;
}
}
如果你想让笛卡尔积显示222, 225, 228, 522, .., 888
你可以(天真地)用 3 个循环来做:
int main()
{
int arr[] = {2, 5, 8};
for (int a:arr){
for (int b:arr){
for (int c:arr){
std::cout << a << b << c << std::endl;
}
}
}
}
一些库 range-v3 提议 cartesian_product
允许更简单:
for (auto t : ranges::view::cartesian_product(arr, arr, arr)) {
std::cout << std::get<0>(t) << std::get<1>(t) << std::get<2>(t) << std::endl;
// std::apply([](auto... args){ (std::cout << ... << args) << std::endl; }, t); // C++17
}
问题在于变量的范围。只需将它们放在块中,一切都很好:
int main()
{
int arr[3]={2,5,8};
int d=3;
for (int a:arr){
int sum = a;
int times=1;
for (int i=1; i<d; i++){
times *= 10;
sum += a*times;
}
cout<<sum<<endl;
}
return 0;
}
变量 sum 和 times 将在块输入时初始化。无需重置它们。