洛谷题解——P1008
题目描述
将1,2,⋯,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。
输入格式
木有输入
输出格式
若干行,每行3个数字。按照每行第1个数字升序排列。
代码
#include<cstdio>
#include<cstring>
int i,j,v;
bool a[10];//ai表示第i个数已经用过了
int main()
{
for(i=123;i<=329;++i)//第一个数的范围,也可以写成100-333
{
memset(a,0,sizeof(a));
v=0;
a[i%10]=a[i/10%10]=a[i/100]=1;
a[i*2%10]=a[i*2/10%10]=a[i*2/100]=1;
a[i*3%10]=a[i*3/10%10]=a[i*3/100]=1;
//如果没有那个数字,那么对应的a就为0
for(j=1;j<=9;j++)//看看1-9是否都有了
{
v+=a[j];
}
if(v==9) printf("%d %d %d\n",i,i*2,i*3);
}
return 0;
}
另一种思想:集合A的数字之和等于集合B的数字之和且集合A的数字之乘等于集合B的数字之乘时,集合A与B元素相等。
#include <stdio.h>
int main()
{
int a,b,c;
for(a=123;a<=333;a++)
{
b=a*2;
c=a*3;
if((a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==1+2+3+4+5+6+7+8+9)&&((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==(1)*(2)*(3)*(4)*(5)*(6)*(7)*(8)*(9)))
printf("%d %d %d\n",a,b,c);
}
return 0;
}
另一种思想:
# include<stdio.h>
int main()
{
int b, c, a[10], flag=0;
for (int i = 100; i <= 333; i++)//第一个数的范围
{
b = i * 2; c = i * 3;
//a中存储的是对应的数字
a[0] = i / 100 % 10; a[1] = i / 10 % 10; a[2] = i % 10;
a[3] = b / 100 % 10; a[4] = b / 10 % 10; a[5] = b % 10;
a[6] = c / 100 % 10; a[7] = c / 10 % 10; a[8] = c % 10;
for (int j = 0; j < 9; j++)//用标记看是否有两个数字相等
{
for (int k = j + 1; k < 9; k++)
{
if (a[j] == a[k]||a[j]==0||a[k]==0)flag = 1;
}
}
if (flag == 0)printf("%d %d %d\n", i, b, c);
flag = 0;
}
}