三连击

蒟蒻我发个史上最简代码

我的思路是:

枚举第一个数,可以推算出第二、三个数
判断是否1~9这9个数字都出现了一遍

Code

#include <cstdio>
#include <cstring>
int a,cnt,i,mark[10]; // mark[i]用来标记数字i有没有出现过:出现过为1,否则为0

// 将数字x的三位标记为已出现
void work(int x)
{
    for (int i=1; i<=3; ++i)
    {
        mark[x%10] = 1; // 拆分数字的每位
        x /= 10;
    }
}

int main()
{
    for (a=100; a<=333; ++a) // 枚举第一个数
    {
        memset(mark, 0, sizeof(mark)); // 清空标记数组
        /*
        memset函数:以字节为单位给一段内存赋值(最常用的就是清空)
        定义在头文件cstring里
        memset的意义不是给每个数组元素赋统一的初值,不要乱用,一般用清空功能就够了
        第一个参数:数组名
        第二个参数:将每个字节改成什么(写0正好是清空数组)
        第三个参数:连续给多少字节的内存赋值
            sizeof(mark):数组占的内存大小(单位:字节)
        */
        work(a); // 标记a的个十百位
        work(a*2); // 标记第二个数的个十百位
        work(a*3); // 标记第三个数的个十百位
        cnt = 0;
        for (i=1; i<=9; ++i) cnt += mark[i]; // 统计一共出现了多少数字
        if (cnt == 9) printf("%d %d %d\n", a, a*2, a*3); // 如果全部出现了就输出答案
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39984146/article/details/79299360