蒟蒻我发个史上最简代码
我的思路是:
枚举第一个数,可以推算出第二、三个数
判断是否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); // 如果全部出现了就输出答案
}
}