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

提问时间:2020-10-15

答案
做出来了,不过我是用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 ", n1, n2, n3);
        }

    }

    return 0;
}
举一反三
已知函数f(x)=x,g(x)=alnx,a∈R.若曲线y=f(x)与曲线y=g(x)相交,且在交点处有相同的切线,求a的值和该切线方程.
我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好
奥巴马演讲不用看稿子.为什么中国领导演讲要看?
想找英语初三上学期的首字母填空练习……
英语翻译
版权所有 CopyRight © 2012-2019 超级试练试题库 All Rights Reserved.