您的位置:首页 > 其它

abc:def:ghi=1:2:3 排列(permutation)

2018-03-14 00:27 531 查看
用1,2,3,…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:
ghi=1:2:3。输出所有解。
分析:用穷举法,不过要优化一下,三个三位数是abc, def, ghi,比率是1:2:3,那么显然d>=(2*a)并且g>=3*a。所以,1<=a<=3,d>=2a,g>=3a;
第一种方法:通过判断1~9的和为45,相乘等于362880来输出
#include <stdio.h>

void result(int num, int &result_add, int &result_mul)
{
int i, j, k;

i = num / 100;        //百位
j = num / 10 % 10;    //十位
k = num % 10;         //个位

result_add += i + j + k;    //分解出来的位数相加
result_mul *= i * j * k;    //相乘
}

int main()
{
int i, j, k;
int result_add, result_mul;

for(i = 123; i <=329; i++)
{
j = i * 2;
k = i * 3;

result_add = 0;
result_mul = 1;

result(i, result_add, result_mul);
result(j, result_add, result_mul);
result(k, result_add, result_mul);

if(result_add == 45 && result_mul == 362880)//判断
printf("%d %d %d\n", i, j, k);
}
return 0;
}
第二种方法:通过hole[0~10]中的数字都为0来判断#include<stdio.h>
int main(){

for(int i = 102;i<333;i++){
int a[3];
a[0] = i;
a[1] = 2*i;
a[2] = 3*i;

int hole[10];
for(int j = 0;j<10;j++)
hole[j]=0;

int flag = 1;
for(int index = 0;index<3 && flag==1 ;index++){
if(hole[a[index]%10]==0)
hole[a[index]%10]=1;//随便一个数字都行
else
flag=0;
if(hole[a[index]/10 %10]==0)
hole[a[index]/10 %10]=1;
else
flag=0;
if(hole[a[index]/100]==0)
hole[a[index]/100]=1;
else
flag=0;

}
if(flag==1)
printf("%d %d %d\n",i,2*i,3*i);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐