【问题描述】将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数。
例如:三个三位数192,384,576满足以上条件。
【输入形式】无
【输出形式】
【样例输入】
【样例输出】
【样例说明】192 384 576
【评分标准】
代码如下:
#include<iostream>
using namespace std;
int x, y, z; //定义全局变量x,y,z用于表示组成每个三位数的三个数字;
int is_butong(int n);
void get_num(int n); //良好的代码需要将主函数写在前面,不要忘记函数声明哦
int main(void)
{
int i,j,k,m; //i,j,k分别代表所要求的三个三位数,m是辅助数组的下标
for ( i = 123; i <= 333; i++)
{
//这里i:j:k==1:2:3, i是最小数,由于每位数的各个位上的数字不同,
//且k不能大于999,因此i的范围为(123,333]
int s[10] = { 0 };
//建立辅助数组并初始化为0,用于判断组成三个三位数的9个数字是否有重复
//0号位空置不用,便于其下标与数字1~9一一对应
//注意到每一轮判断都要初始化数组s,因此初始化不能在for循环前面
if (is_butong(i))//如果i各个位上的数字不同
{
j = i * 2; //则由i生成j和k,以减少循环次数
k = i * 3;
if (is_butong(j)&&is_butong(k)) //判断生成的j和k各个位上的数字是否不同
{
if (j <= 999 && k <= 999) //判断j和k是否超出题设范围
{
//如果条件均满足,依次获取i,j,k各自各个位上的数字x,y,z
//并将其所在辅助数组上的值加1;
get_num(i);
s[x]++; s[y]++; s[z]++;
get_num(j);
s[x]++; s[y]++; s[z]++;
get_num(k);
s[x]++; s[y]++; s[z]++;
for (m = 1; m <= 9; m++)
{
//循环遍历辅助数组
//如果发现辅助数组1~9号位有数值为0的元素
//则说明这三个三位数并没有用完数字1~9,即有重复使用的数字,那么跳出循环
if (s[m] == 0)
break;
}
if (m == 10)
cout<<i<<" "<<j<<" "<<k<<endl;
//如果m=10,即这三个三位数无重复使用的数字,满足题设条件,则依次将其打印输出
}
}
}
}
return 0;
}
//用于判断一个三位数各个位是否相同的函数,如果不同,返回1,否则返回0
int is_butong(int n)
{
int a, b, c;
a = n % 10;
b = n / 10 % 10;
c = n / 100;
if (a != b && a != c && b != c)
return 1;
else
return 0;
}
//用于获取一个三位数各个位上的数字的函数
void get_num(int n)
{
x = n % 10;
y = n / 10 % 10;
z = n / 100;
}
输出结果: