1—9数,分成三组,三个三位数比例1:2:3;求所有三位数
- 1:2:3,可遍历a>123&&a<333,b=a2, c=a3(设置数)
- 判断条件:
九个数相加等于45九个数相乘等于9!(数学原理,两个集合所有数相加相乘结果一样);
a.b.c的个十百位数对应的数组元素设为1,数组相加为九成立;
对a个十百位i.,j,k遍历,对abc各位用函数存储元素个数,如果1—9元素个数均为1,成立;
(洛谷上的题解)
#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<cstdio>
#include<cstring>
int i,j,v;bool a[10];//ai表示第i个数已经用过了
int main()
{
for(i=192;i<=327;i++)
{
memset(a,0,sizeof(a));v=0;//清零
a[i%10]=a[i/10%10]=a[i/100]=a[i*2%10]=a[i*2/10%10]=a[i*2/100]=a[i*3%10]=a[i*3/10%10]=a[i*3/100]=1;//统计数字
for(j=1;j<=9;j++) v+=a[j];//v表示1-9这些数字是否全部齐了
if(v==9) printf("%d %d %d\n",i,i*2,i*3);//如果齐了就输出
}
return 0;
}
#include<iostream>
using namespace std;
int gw; //个位
int d[9];//用来计数,因为一个数的个位只可能是1,2,3...到9,所以只要9位
int cf(int x){//我们定义一个函数,拆分我们组合出来的每一位数,所以它叫拆分√
while(x!=0){
gw=x%10;
x=(x-gw)/10; //其实完全可以x/10,为了理解方便,我们将x的个位减为0,然后/10把0削去,不断将当期的数拆分
d[gw]++;//计数器加1
}
}
int main(){
int a,b,c;
for (int i=1;i<=9;i++)
for (int j=1;j<=9;j++)
for (int k=1;k<=9;k++){
a=i*100+j*10+k;
b=a*2;
c=a*3;
cf(a);//将创造出的满足条件的数扔到函数中拆分
cf(b);
cf(c);
if(d[1]==1&&d[2]==1&&d[3]==1&&d[4]==1&&d[5]==1&&d[6]==1&&d[7]==1&&d[8]==1&&d[9]==1){//如果这3个创造出来的数满足每一位都被使用且只用1次,输出
cout<<a<<" "<<b<<" "<<c<<endl;
}
for (int e=1;e<=9;e++){//判断之后将计数的数组置为0,方便下次使用,不然你一个数都不会输出
d[e]=0;//可以用memset重置
}
}
return 0;
}