P1008 [NOIP1998 普及组] 三连击

P1008 [NOIP1998 普及组] 三连击

 题目描述:将 1,2,…,9 共 9个数分成 3 组,分别组成 3 个三位数,且使这 3个三位数构成 1:2:3的比例,试求出所有满足条件的 3个三位数。
这道题解法有很多种,题目说了,按照每行第一个数字升序排列,那么在循环找数的时候,就要以第一个数为主,从小往大找.接着,我们还知道三位数中123是每个数字都不重复且最小的,987是每个数字都不重复且最大的,所以,第一个数的循环范围是大于123且它的三倍小于987,即987/3≥a≥123,再把这三个数的个位十位百位都求出来,接下来从小到大排序,最后判断是否和{1,2,3,4,5,6,7,8,9}相等就行了,代码如下。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
    int a,b,c;
    int i,j; 
    int s[9];
    for(a=123;a<=329;a++)
    {
        b=a*2;
        c=a*3;  //让三个数成比例 
        s[0]=a/100;s[1]=a%100/10;s[2]=a%10;//分离每一位数,并用数组记录 
        s[3]=b/100;s[4]=b%100/10;s[5]=b%10;
        s[6]=c/100;s[7]=c%100/10;s[8]=c%10;
        
        for(i=0;i<8;i++)
        {
            for(j=i+1;j<9;j++)
            {
                if(s[i]==s[j]||s[i]==0||s[j]==0) break;//判断元素是否相等 
            }
            if(j<9) break;
        }
        if(i==8&&j==9)
          cout<<a<<" "<<b<<" "<<c<<" "<<endl;
    }
    return 0;
 } 

 

posted @ 2022-08-21 20:02  为么要取名字  阅读(110)  评论(0编辑  收藏  举报