嵌套循环是否有替代方案来显示 n 范围内的可能组合?
Is there an alternative on nested loop for displaying possible combination in range of n?
我创建了一些代码,每当你在 pinCombo(x)
中输入数字时(例如 pinCombo(3)
),输出将是:
000
001
002
…直到达到999。
因此,pinCombo(4)
输出将是:
0000
0001
....
....
9999
这是我的代码:
#include <iostream>
using namespace std;
void pinCombo(int x)
{
int a,b,c,d,e,f,g,h,i,j;
if(x>=1)
for (a = 0;a<10;a++)
{
if(x>=2)
for (b = 0;b<10;b++)
{
if(x>=3)
for (c = 0;c<10;c++)
{
if(x>=4)
for (d = 0;d<10;d++)
{
if(x>=5)
for (e = 0;e<10;e++)
{
if(x>=6)
for (f = 0;f<10;f++)
{
if(x>=7)
for (g = 0;g<10;g++)
{
if(x>=8)
for (h = 0;h<10;h++)
{
if(x>=9)
for (i = 0;i<10;i++)
{
if(x>=10)
for (j = 0;j<10;j++)
{
cout<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<endl;
}if(x==9)cout<<a<<b<<c<<d<<e<<f<<g<<h<<i<<endl;
}if(x==8)cout<<a<<b<<c<<d<<e<<f<<g<<h<<endl;
}if(x==7)cout<<a<<b<<c<<d<<e<<f<<g<<endl;
}if(x==6)cout<<a<<b<<c<<d<<e<<f<<endl;
}if(x==5)cout<<a<<b<<c<<d<<e<<endl;
}if(x==4)cout<<a<<b<<c<<d<<endl;
}if(x==3)cout<<a<<b<<c<<endl;
}if(x==2)cout<<a<<b<<endl;
}if(x==1)cout<<a<<endl;
}
}
using namespace std;
int main()
{
pinCombo(3);
return 0;
}
有没有办法在不使用嵌套循环或不使用许多变量的情况下创建这样的程序?
您可以使用 %
运算符实现此目的:
#include <iostream>
#include <cmath>
void pinCombo(int x)
{
int* digits = new int[x];
int limit = std::pow(10, x);
for (int n = 0; n < limit; n++) {
int nn = n;
for (int i = 0; i < x; i++) {
digits[i] = nn % 10;
nn /= 10;
}
for (int i = x-1; i >= 0; i--) {
std::cout << digits[i];
}
std::cout << "\n";
}
delete[] digits;
}
int main()
{
pinCombo(3);
}
这将输出:
000
001
002
...
999
编辑: 您可以使用 <iomanip>
设施实现同样的事情:
void pinCombo(int x)
{
int limit = std::pow(10, x);
for (int i = 0; i < limit; i++)
std::cout << std::setw(x) << std::setfill('0') << i << std::endl;
}
旁注: 使用 using namespace std
被认为是一种不好的做法,因为它会用 C++ 标准中包含的所有内容污染全局命名空间。使用 std::
前缀,或者如果您更喜欢快捷方式,则使用 using std::<whataver_you_want>
。
这是使用 setwidth
和 setfill
的解决方案。
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
void pinCombo(int x){
for (int i = 0; i < pow(10, x); i++){
cout << setw(x) << setfill('0') << i << endl;
}
}
int main(){
pinCombo(3);
return 0;
}
我创建了一些代码,每当你在 pinCombo(x)
中输入数字时(例如 pinCombo(3)
),输出将是:
000
001
002
…直到达到999。
因此,pinCombo(4)
输出将是:
0000
0001
....
....
9999
这是我的代码:
#include <iostream>
using namespace std;
void pinCombo(int x)
{
int a,b,c,d,e,f,g,h,i,j;
if(x>=1)
for (a = 0;a<10;a++)
{
if(x>=2)
for (b = 0;b<10;b++)
{
if(x>=3)
for (c = 0;c<10;c++)
{
if(x>=4)
for (d = 0;d<10;d++)
{
if(x>=5)
for (e = 0;e<10;e++)
{
if(x>=6)
for (f = 0;f<10;f++)
{
if(x>=7)
for (g = 0;g<10;g++)
{
if(x>=8)
for (h = 0;h<10;h++)
{
if(x>=9)
for (i = 0;i<10;i++)
{
if(x>=10)
for (j = 0;j<10;j++)
{
cout<<a<<b<<c<<d<<e<<f<<g<<h<<i<<j<<endl;
}if(x==9)cout<<a<<b<<c<<d<<e<<f<<g<<h<<i<<endl;
}if(x==8)cout<<a<<b<<c<<d<<e<<f<<g<<h<<endl;
}if(x==7)cout<<a<<b<<c<<d<<e<<f<<g<<endl;
}if(x==6)cout<<a<<b<<c<<d<<e<<f<<endl;
}if(x==5)cout<<a<<b<<c<<d<<e<<endl;
}if(x==4)cout<<a<<b<<c<<d<<endl;
}if(x==3)cout<<a<<b<<c<<endl;
}if(x==2)cout<<a<<b<<endl;
}if(x==1)cout<<a<<endl;
}
}
using namespace std;
int main()
{
pinCombo(3);
return 0;
}
有没有办法在不使用嵌套循环或不使用许多变量的情况下创建这样的程序?
您可以使用 %
运算符实现此目的:
#include <iostream>
#include <cmath>
void pinCombo(int x)
{
int* digits = new int[x];
int limit = std::pow(10, x);
for (int n = 0; n < limit; n++) {
int nn = n;
for (int i = 0; i < x; i++) {
digits[i] = nn % 10;
nn /= 10;
}
for (int i = x-1; i >= 0; i--) {
std::cout << digits[i];
}
std::cout << "\n";
}
delete[] digits;
}
int main()
{
pinCombo(3);
}
这将输出:
000
001
002
...
999
编辑: 您可以使用 <iomanip>
设施实现同样的事情:
void pinCombo(int x)
{
int limit = std::pow(10, x);
for (int i = 0; i < limit; i++)
std::cout << std::setw(x) << std::setfill('0') << i << std::endl;
}
旁注: 使用 using namespace std
被认为是一种不好的做法,因为它会用 C++ 标准中包含的所有内容污染全局命名空间。使用 std::
前缀,或者如果您更喜欢快捷方式,则使用 using std::<whataver_you_want>
。
这是使用 setwidth
和 setfill
的解决方案。
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
void pinCombo(int x){
for (int i = 0; i < pow(10, x); i++){
cout << setw(x) << setfill('0') << i << endl;
}
}
int main(){
pinCombo(3);
return 0;
}