#include<stdio.h>
/*
将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<stdio.h>
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;
}