排列(permutation)——算法竞赛入门经典

题目:用1,2,3,...,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。

解法一 查找1-9是否都存在于s字符数组中

#include
#include

int main(){
	for(int i=123;i<=329;i++){
		int temp=i*1000000+i*2*1000+i*3;
		char s[10];
		sprintf(s,"%d",temp);
		int j=0; 
		//printf(s);
		for(int k ='1';k<='9';memchr(s,k++,9)&&j++);
		if(j==9)
			printf("%d %d %d\n",i,2*i,3*i);
	}
	return 0;
} 
  • sprintf函数的用法

格式:sprintf(char *string, char *farmat [,argument,...]);

功能:送格式化输出到字符串中

说明:由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已。前者打印到字符串中,后者则直接在命令行上输出。

  • memchr函数的用法

使用时要加#include

格式:memchr(const void *buf, int ch, size_t count);

功能:从buf所指内存区域的前count个字节查找字符ch

说明:当第一次遇到字符ch时停止查找。如果成功,返回指向字符ch的指针;否则返回NULL。

解法二 利用1-9的和为45,积为362880

#include
#include

void result(int n,int &result_add,int &result_mul){
	int i=n/100,j=n/10%10,k=n%10;
	result_add+=i+j+k;
	result_mul*=i*j*k;
}
int main(){
	for(int i=123;i<=329;i++){
		int j=i*2,k=i*3;
		int result_add=0,result_mul=1;
		result(i,result_add,result_mul);
		result(j,result_add,result_mul);
		result(k,result_add,result_mul);
		if(result_add==45&&result_mul==362880)
			printf("%d %d %d\n",i,j,k);
	}
	return 0;
} 

解法三 查找每个数字出现的次数是否为1

#include
#include

int main(){
	char c[9]={0};
	for(int i=123;i<=329;i++){
		char s[9]={0};
		int temp=i*1000000+i*2*1000+i*3;
		int flag=0;
		sprintf(c,"%d",temp);
		for(int m=0;m<9;m++){
			c[m]=c[m]-'0';
			if(c[m]==0) continue;
			s[c[m]-1]++;
		}
		for(int x=0;x<9;x++){
			if(s[x]!=1){
				flag=1;
				break;
			}
		}
		if(!flag)
			printf("%d %d %d\n",i,2*i,3*i);
	}
	return 0;
} 
  • 注意:temp是以字符在存储在数组c中的,需要减去‘0’转换

你可能感兴趣的:(算法)