习题2-6:排列
用1,2,3,...9组成三位数abc,def,ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。
第一次做的代码:
#include<iostream>
#include<string>
#include<algorithm>
int test(int a[],int n){
for(int i=0;i<n;i++){
if(a[i]!=(i+1))
return 0;
}
return 1;
}
using namespace std;
int main(){
int a,b,c,m[9];
for(a=100;a<=333;a++){
for(b=200;b<=666;b++){
for(c=300;c<=999;c++){
m[0]=a%10;
m[1]=a/100;
m[2]=a/10%10;
m[3]=b%10;
m[4]=b/100;
m[5]=b/10%10;
m[6]=c%10;
m[7]=c/100;
m[8]=c/10%10;
sort(m,m+9);
if(test(m,9)){
if(2*a==b&&3*a==c)
printf("%d %d %d\n",a,b,c);
}
}
}
}
return 0;
}
结果时间复杂度太高,答案出的很慢,于是又查了查网上的,自己又敲了一遍:
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int m[10]={0};
int a,b,c,i,j=0,k;
for(i=123;i<=333;i++){
memset(m,0,sizeof(m));
k=0;
b=2*i;
c=3*i;
m[i%10]=1;
m[i/10%10]=1;
m[i/100]=1;
m[b%10]=1;
m[b/10%10]=1;
m[b/100]=1;
m[c%10]=1;
m[c/10%10]=1;
m[c/100]=1;
for(j=1;j<=9;j++){
k+=m[j];
}
if(k==9)
printf("%d %d %d\n",i,2*i,3*i);
}
return 0;
}
浙公网安备 33010602011771号