最新消息:

三连击

C++ 少儿编程 1807浏览 0评论

问题描述

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;

        //统计ab、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案例讲解

您必须 登录 才能发表评论!