三连击

题目描述

1,2,⋯,99个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。

例如:192 384 576

解法1:用字符串解决

#include <cstdio>
using namespace std;
int main(){
    for (int i=123;i<=333;i++){
        char a[4],b[4],c[4];//字符串结束符占用一个字符空间
        sprintf(a,"%d",i);//将int转换为char
        sprintf(b,"%d",i*2);
        sprintf(c,"%d",i*3);
        bool num[10] = {0};
        num[a[0]-48] = true;//ascii码中,0-9对应48-57
        num[a[1]-48] = true;
        num[a[2]-48] = true;
        num[b[0]-48] = true;
        num[b[1]-48] = true;
        num[b[2]-48] = true;
        num[c[0]-48] = true;
        num[c[1]-48] = true;
        num[c[2]-48] = true;
        if (num[0]) continue;//题目要求1-9的数字,出现0即为Wrong Answer
        int count = 0;
        for (int i=0;i<10;i++) if (num[i]) count ++;
        if (count == 9){
            printf("%s %s %s\n",a,b,c);
        }
    }
    return 0;
}

 第二种方法:利用C++ STL提供的集合,把得到的三位数逐位放到命名为cache的这个集合(set)里,集合里出现零就跳过,集合元素数够9了就输出

#include <cstdio>
#include <set>
#define INS(x)  cache.insert(x/100); cache.insert(x%100/10); cache.insert(x%10);
using namespace std;
int main(){
    for(int a=123;a<=329;a++){
        int b=a*2,c=a*3;
        set<int> cache;
        INS(a)
        INS(b)
        INS(c)
        if(cache.count(0)) continue;
        if(cache.size()==9){
            printf("%d %d %d\n",a,b,c);
        }
    }
    return 0;
}

 答案:

192 384 576
219 438 657
273 546 819
327 654 981

 

posted @ 2019-02-15 15:03  立体风  阅读(834)  评论(0编辑  收藏  举报