三连击
题目描述
将1,2,⋯,9共9个数分成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