Luogu P1618 三连击(升级版)
题目描述
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
//感谢黄小U饮品完善题意
输入输出格式
输入格式:
三个数,A B C。
输出格式:
若干行,每行3个数字。按照每行第一个数字升序排列。
输入输出样例
说明
保证A<B<C
思路:无难度,和原题相同
1 #include <stdio.h> 2 #include <string.h> 3 4 int isSuitable(int); 5 int getFirst(int); 6 int getMid(int); 7 int getEnd(int); 8 9 int x,y,z; 10 11 int main() { 12 int i,flag; 13 scanf ("%d%d%d",&x,&y,&z); 14 flag=0; 15 for (i=100;i<999;i++) { 16 if (isSuitable(i)) { 17 flag=1; 18 printf ("%d %d %d\n",i,i*y/x,i*z/x); 19 } 20 } 21 if (!flag) printf ("No!!!\n"); 22 return 0; 23 } 24 25 int isSuitable(int a) { 26 int b,c,i; 27 int t[10]; 28 memset (t,0,sizeof(t)); 29 b=a*y/x; 30 if (b>999) return 0; 31 c=a*z/x; 32 if (c>999) return 0; 33 t[getFirst(a)]++; 34 t[getMid(a)]++; 35 t[getEnd(a)]++; 36 t[getFirst(b)]++; 37 t[getMid(b)]++; 38 t[getEnd(b)]++; 39 t[getFirst(c)]++; 40 t[getMid(c)]++; 41 t[getEnd(c)]++; 42 for (i=1;i<10;i++) { 43 if (t[i]==0) return 0; 44 } 45 return 1; 46 } 47 48 int getFirst(int x) { 49 return x / 100; 50 } 51 52 int getMid(int x) { 53 x -= 100*getFirst(x); 54 return x / 10; 55 } 56 57 int getEnd(int x) { 58 return x - 100*getFirst(x) - 10*getMid(x); 59 }