穷举法求等比数

#include
	/*
	将1~9共9个数分成3组,分别组成3个3位数,且使这3个3位数构成1:2:3的比例,
	试求出所有满足条件的 3个3 位数。例如,3个3 位数 192、384、576 满足以上条件。
	*/ 
void repeat(int *p,int n)
{
	for(int a=0;a<3;a++)
	{
		p[n%10]=1;
		n/=10;
	}
}

int allUser(int *q)
{
	for(int f=1;f<10;f++)
	{
		if(q[f]!=1)
		{
			return 0;
		}
	}
	return 1;
}

int main()
{
	int i,j,k;
	for(i=123;i<=333;i++)
	{
		j=i*2;
		k=i*3;
		int num[10]={0};
		repeat(num,i);
		repeat(num,j);
		repeat(num,k);
		if(allUser(num)==1)
		{
			printf("%d %d %d\n",i,j,k);
		}
	}	
	return 0;
}

        三个数由9个数字构成,只需要使用一个数组,数组num的num[1]~num[9]存储这9个数字,repeat函数的作用是将三个数分别调用repeat函数后将这三个数的每一个数字存入数组num中,如果不重复的话,那么其中每个元素的值都为1,allUser函数的作用就是判断每个元素的值是否为1的。

最后,其实i循环循环到329就行了,因为329乘3之后会出现两个相同的数字,因此987之后的就不可以了。

 此外,还有另一种方法,如下:

#include
int fun(int a,int b,int c)
{
	int sum=0,x=1;
	int t1=45;//1+2+3+...+9
	int t2=362880;//1*2*3...*9
	while(a>0)
	{
		sum=sum+a%10+b%10+c%10;
		x=x*(a%10)*(b%10)*(c%10);
		a=a/10;
		b=b/10;
		c=c/10;
	}
	if(sum==t1&&x==t2)
	{
		return 1;
	}
	return 0;
}
int main()
{
	int num=0;
	for(int i=123;i<329;i++)
	{
		if(fun(i,2*i,3*i))
		{
			printf("第%d组:%d %d %d\n",++num,i,2*i,3*i);
		}
	}
	return 0;
}

你可能感兴趣的:(C语言程序设计,算法,数据结构)