难度:中 , 但是麻烦
不想看思路可以跳到最后
题目描述
将 1,2,…,91,2,…,9 共 99 个数分成 33 组,分别组成 33 个三位数,且使这 33 个三位数构成 1:2:31:2:3 的比例,试求出所有满足条件的 33 个三位数。
输入格式
无
输出格式
若干行,每行 3 个数字。按照每行第 1 个数字升序排列。
解题思路
一时间可能没有头绪但可以暴力枚举
用ap数组来存储数字1-9的个数
short int ap[10];//数字一到九存在的个数
short int 可以节约一定空间相较与 int (4byte)他只有2byte
函数部分
int main() {
for (int i = 1; i <= 333; i++) {
memset(ap, 0, sizeof(ap));//归零一下
int j = i * 2, k = i * 3;//计算第二个数和第三个
if (i * 6 == j * 3)if (i * 6 == k * 2)if (j * 3 == k * 2)//最小公倍数为6 1:2:3
{
int a = i, b = j, c = k;
//取出每一位
ap[a % 10]++; a /= 10;
ap[a % 10]++; a /= 10;
ap[a % 10]++; a /= 10;
ap[b % 10]++; b /= 10;
ap[b % 10]++; b /= 10;
ap[b % 10]++; b /= 10;
ap[c % 10]++; c /= 10;
ap[c % 10]++; c /= 10;
ap[c % 10]++; c /= 10;
int flag = true;//符合输出
for (int p = 1; p <= 9; p++)if (ap[p] != 1)
{
flag = false;
break;
}
if (flag)printf("%d %d %d\n", i, j, k);
}
}
return 0;//好习惯
}
memset用来初始化数组
完整代码
#include<bits/stdc++.h>
using namespace std;
short int ap[10];//数字一到九存在的个数
int main() {
for (int i = 1; i <= 333; i++) {
memset(ap, 0, sizeof(ap));//归零一下
int j = i * 2, k = i * 3;//计算第二个数和第三个
if (i * 6 == j * 3)if (i * 6 == k * 2)if (j * 3 == k * 2)//最小公倍数为6 1:2:3
{
int a = i, b = j, c = k;
//取出每一位
ap[a % 10]++; a /= 10;
ap[a % 10]++; a /= 10;
ap[a % 10]++; a /= 10;
ap[b % 10]++; b /= 10;
ap[b % 10]++; b /= 10;
ap[b % 10]++; b /= 10;
ap[c % 10]++; c /= 10;
ap[c % 10]++; c /= 10;
ap[c % 10]++; c /= 10;
int flag = true;//符合输出
for (int p = 1; p <= 9; p++)if (ap[p] != 1)
{
flag = false;
break;
}
if (flag)printf("%d %d %d\n", i, j, k);
}
}
return 0;
}
逃课答案
#include<bits/stdc++.h>
using namespace std;
int main() {
cout << "192 384 576\n";
cout << "219 438 657\n";
cout << "273 546 819\n";
cout << "327 654 981\n";
return 0;
}