问题描述
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数。
例如:三个三位数192,384,576满足以上条件。
输入:
无。
输出:
输出所有符合要求的三个三位数,每一组占一行,数字之间由一个空格分隔。
每组中的三个数字按照从小到大输出,各组之间按照每组的第一个数从小到大输出。
问题解析:
因为要组成一个三位数,数值从100-999,同时题目要求使用1-9这九个数字,每个数字只能用一次,9个数字都用上。所以最小的三位数是123。组成的三个三位数构成1:2:3的比例,999/3=333,也就是最大的三位数是333,即329。
所以最小数的取值范围为123-329。使用循环进行遍历,要想确保每个数字都用上1遍,可以使用桶排序的思想进行判断。
参考代码:
#include <iostream>
#include <cstring>
using namespace std;
int visit[10]={},a,b,c,i;
int main(){
for( a = 123;a <= 329;a++){
//每一组都需要重新将visit数组赋值为0
memset(visit,0,sizeof(visit));
b = 2*a;
c = 3*a;
//统计a、b、c三位数的各个位数字
visit[a/100]++;
visit[a%10]++;
visit[a/10%10]++;
visit[b/100]++;
visit[b%10]++;
visit[b/10%10]++;
visit[c/100]++;
visit[c%10]++;
visit[c/10%10]++;
//如果有一个数字使用的次数不是1,则重新换下一组数据
for(i = 1;i <=9;i++){
if(visit[i] != 1){
break;
}
}
//如果1-9所有数字都使用了1次,则依次输出a,b,c
if(i == 10){
cout <<a << ” ” << b << ” ” << c << endl;
}
}
return 0;
}
转自公众号:
noip案例讲解