用123...9这九个数字组成三个三位数,使第二个数是第一个数的两倍,第三个是第一个数的3倍,用C++怎样实现

用123...9这九个数字组成三个三位数,使第二个数是第一个数的两倍,第三个是第一个数的3倍,用C++怎样实现
其他人气:926 ℃时间:2019-10-20 19:43:02
优质解答
做出来了,不过我是用C写的,你应该可以改成C++的吧,主要还是思路,讲解一下我的思路吧:


如果用排列组合的话,工作量肯定很大,我们可以反过来想,假设有第一个数,那么我们可以求出第二个数和第三个数,然后计算这三个数中所有位上的数字的个数,统计下,看是否从1-9都使用了一遍,如果是,那么这三个数就是要求的,否则接着找.


第一个数怎么就有了呢,很简单,既然是三位数,我们从100开始循环就行了,直到999;不过仔细想想,其实不用循环到999,因为到333的时候,第三个数刚好是999,334的时候第三个数就不是三位数了.因此第一个数从100循环到333就可以了.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    int i, j, k, flag;
    int num1, num2, num3, n1, n2, n3;//分别表示第一个数、第二个数和第三个数
    int s[12];                       //记录数字的个数

    //只需要循环333次就够了,接着往下循环的话,第三个数就超过1000了
    for(i=100; i<=333; i++)
    {
        //将数组a的值全部置为0
        for(j=0; j<10; j++)
        {
            s[j] = 0;
        }
        flag = 1;

        n1 = num1 = i;
        n2 = num2 = i*2;
        n3 = num3 = i*3;

        //一下三个while循环是统计各个位上数字的个数
        while(num1)
        {
            k = num1%10;
            s[k]++;
            num1 /= 10;
        }
        while(num2)
        {
            k = num2%10;
            s[k]++;
            num2 /= 10;
        }
        while(num3)
        {
            k = num3%10;
            s[k]++;
            num3 /= 10;
        }

        //判断1-9的使用情况,如果一个数使用多次或一次也没使用,表示不符合要求
        for(j=1; j<10; j++)
        {
            if(s[j]>=2 || s[j]==0)
            {
                flag = 0;
                break;
            }
        }
        if(flag == 1)
        {
            printf("%-5d%-5d%-d\n", n1, n2, n3);
        }

    }

    return 0;
}
我来回答
类似推荐
请使用1024x768 IE6.0或更高版本浏览器浏览本站点,以保证最佳阅读效果。本页提供作业小助手,一起搜作业以及作业好帮手最新版!
版权所有 CopyRight © 2012-2024 作业小助手 All Rights Reserved. 手机版