题解 P1618 【三连击(升级版)】
这题和普通版三连击差不多,只是倍数改了。
首先有一个数学规律:
这个三个数的每一位之积一定等于9的阶乘
且每一位都不相同
思路:
先枚举a,bc两数用比例乘上去,a最小为123,且很显然小于333,然后裂解出每一位,再根据数学规律判断即可。
###### #include<cstdio>
using namespace std;
int main(){
int a,b,c,count = 0;//a,b,c为所给数,count为是否存在的个数
//以下三行均为a,b,c的每一位
int a100,a10,a1;
int b100,b10,b1;
int c100,c10,c1;
float x,y,z;//比例
scanf("%f %f %f",&x,&y,&z);
//开始迭代
for(a = 123;a <= 329;a++){
//裂解a,其实这里的裂解方式是最菜的,不要学我23333
a100 = a / 100;
a10 = (a - (a100 * 100)) / 10;
a1 = (a % 100) % 10;
//计算b,c
b = a * (y / x);
c = a * (z / x);
//裂解b
b100 = b / 100;
b10 = (b - (b100 * 100)) / 10;
b1 = (b % 100) % 10;;
//裂解c
c100 = c / 100;
c10 = (c - (c100 * 100)) / 10;
c1 = (c % 100) % 10;
//按照数学规律判断,简单明了,不过字多了点就是
if(((a100 * a10 * a1 * b100 * b10 * b * c100 * c10 * c1) == (1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9)) && (a100 != a10) && (a100 != a1) && (a100 != b100) && (a100 != b10) && (a100 != b1) && (a100 != c100) && (a100 != c10) && (a100 != c1) && (a10 != a1) && (a10 != b100) && (a10 != b10) && (a10 != b1) && (a10 != c100) && (a10 != c10) && (a10 != c1) && (a1 != b100) && (a1 != b10) && (a1 != b1) && (a1 != c100) && (a1 != c10) && (a1 != c1) && (b100 != b10) && (b100 != b1) && (b100 != c100) && (b100 != c10) && (b100 != c1) && (b10 != b1) && (b10 != c100) && (b10 != c10) && (b10 != c1) && (b1 != c100) && (b1 != c10) && (b1 != c1) && (c100 != c10) && (c100 != c1) && (c10 != c1) ){
count++;//存在就自加,不存在则为0
printf("%d %d %d\n",a,b,c);
}
}
//不存在就输出
if(count == 0){
printf("No!!!");
}
return 0;
}