题解 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;
}