习题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;
}

  

posted @ 2021-01-30 17:43  JYC的进阶之旅  阅读(86)  评论(0)    收藏  举报