新手村这道题实在是太不友好了。。。
看了题解,归纳出来:
题解思路:用循环枚举出最小数,然后分别乘以2和3得到第二、三个数。再验证其三位能组成1——9.能则输出。
破题点:
1.最小数的取值从理论上来说应是123——333
2.逆向思考,先令其满足1:2:3再验证其刚好由1~9组成
3.如何验证其由1~9组成
题目:
将1,2,…,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数
我的解法:
//定义一个数组,判断这组数是否出现1~9一次且仅一次。
#include<iostream>
using namespace std;
int main(){
int i,a,b,j;
for(i=123;i<333;i++){
int m[11]={0};//用于判断的数组
int sum=0;
a=2*i;
b=3*i;
m[i/100]=1;//以下将所有出现的数字记录
m[i/10%10]=1;
m[i%10]=1;
m[a/100]=1;
m[a/10%10]=1;
m[a%10]=1;
m[b/100]=1;
m[b/10%10]=1;
m[b%10]=1;
for(j=1;j<10;j++)
sum+=m[j];
if(9==sum)//验证这组数是否出现1~9一次且仅一次
cout<<i<<" "<<a<<" "<<b<<endl;
}
return 0;
}
()
题解第一位的大佬用的是“两个集合,其元素之积、元素之和都分别相等,则两个集合完全相同”的数学思想。(反正我是不明白为啥。。。tqltql)大佬数学思想部分:
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);