【竞赛题】求出满足条件的三个三位数

【问题描述】将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;
}

输出结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值