这个题其实是比较简单的,但很多人可能不敢写10个循环,比如我。。因为我当时想着10个循环,时间复杂度整这么高,不得把电脑算死,但实际上每个循环只运行3次,所以就还行
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
int score = 0;
if (n < 9||n>30) {
cout << 0 << "\n";
}
else {
for(int a=1;a<=3;a++)for (int b = 1; b <= 3; b++)for (int c = 1; c <= 3; c++)for (int d = 1; d <= 3; d++)
for (int e = 1; e <= 3; e++)for (int f = 1; f <= 3; f++)for (int g = 1; g <= 3; g++)for (int h = 1; h <= 3; h++)
for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)
if (a + b + c + d + e + f + g + h + i + j==n) {
score++;
}
cout << score << "\n";
for (int a = 1; a <= 3; a++)for (int b = 1; b <= 3; b++)for (int c = 1; c <= 3; c++)for (int d = 1; d <= 3; d++)
for (int e = 1; e <= 3; e++)for (int f = 1; f <= 3; f++)for (int g = 1; g <= 3; g++)for (int h = 1; h <= 3; h++)
for (int i = 1; i <= 3; i++)for (int j = 1; j <= 3; j++)
if (a + b + c + d + e + f + g + h + i + j == n) {
cout<<a<<" " << b << " " << c << " " << d << " " << e << " " << f << " " << g << " " << h << " " << i << " " << j << " ";
cout << "\n";
}
}
return 0;
}
然后如果不想这么复杂的话可以加个宏定义
#define rep(i,a,b) for(int i=a;i<b;i++)
然后里面所有的循环都可以替换成这个宏定义,即rep(a,1,3)=for(int a=1;a<=3;a++)能够简单一点吧。
然后这道题理论上是还可以优化的,但是作者懒得优化了。(就是和是一定的,前面的数确定后,就可以约束后面数的范围)