Luogu P1618 三连击(升级版)

  

题目描述

将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。

//感谢黄小U饮品完善题意

输入输出格式

输入格式:

 

三个数,A B C。

 

输出格式:

 

若干行,每行3个数字。按照每行第一个数字升序排列。

 

输入输出样例

输入样例#1: 复制
1 2 3
输出样例#1: 复制
192 384 576
219 438 657
273 546 819
327 654 981

说明

保证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 }

 

posted @ 2018-03-30 10:32  yachen2018  阅读(161)  评论(0编辑  收藏  举报