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

问题描述:

用123...9这九个数字组成三个三位数,使第二个数是第一个数的两倍,第三个是第一个数的3倍,用C++怎样实现
1个回答 分类:综合 2014-11-08

问题解答:

我来补答
做出来了,不过我是用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;
}
 
 
展开全文阅读
剩余:2000
上一页:希望高人解答