子曰:“三人行,必有我师焉。择其善者而从之,其不善者而改之。”
本题给定甲、乙、丙三个人的能力值关系为:甲的能力值确定是 2 位正整数;把甲的能力值的 2 个数字调换位置就是乙的能力值;甲乙两人能力差是丙的能力值的 X 倍;乙的能力值是丙的 Y 倍。请你指出谁比你强应“从之”,谁比你弱应“改之”。
输入格式:
输入在一行中给出三个数,依次为:M(你自己的能力值)、X 和 Y。三个数字均为不超过 1000 的正整数。
输出格式:
在一行中首先输出甲的能力值,随后依次输出甲、乙、丙三人与你的关系:如果其比你强,输出 Cong
;平等则输出 Ping
;比你弱则输出 Gai
。其间以 1 个空格分隔,行首尾不得有多余空格。
注意:如果解不唯一,则以甲的最大解为准进行判断;如果解不存在,则输出 No Solution
。
输入样例 1:
48 3 7
输出样例 1:
48 Ping Cong Gai
输入样例 2:
48 11 6
输出样例 2:
No Solution
解题思路:
刚开始完全是自己在做,结果写出来自己看着都感觉好复杂,不满意。在学习了网上其他人的思路后,改进了我自己的代码,终于比较满意了。所以向别人学习还是非常重要的啊。
原始代码
从低到高遍历,为了找甲的最大值,每次找到符合条件的值要先保存下来,最后遍历完成才能继续下一步,后面的判断也做得很繁琐
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 6
typedef struct _node *PtrN;
typedef struct _node {
int jia, yi;
double bin;
} Node;
int main(int argc, const char *argv[]) {
int M, X, Y, a, b;
double c;
char s1[MAXN], s2[MAXN], s3[MAXN];
if ( scanf("%d%d%d", &M, &X, &Y)==EOF ) printf("error\n");
PtrN powerOfThree = NULL;
for ( a=10; a<100; ++a ) {
b = a%10*10 + a/10;
if ( (double)abs(a-b)/X == (double)b/Y ) {
c = (double)b/Y;
PtrN clean = powerOfThree;
powerOfThree = (PtrN)malloc(sizeof(Node));
powerOfThree->jia = a;
powerOfThree->yi = b;
powerOfThree->bin = c;
free(clean);
}
}
if ( powerOfThree ) {
if ( powerOfThree->jia > M )
strcpy(s1,"Cong");
else if ( powerOfThree->jia == M )
strcpy(s1,"Ping");
else
strcpy(s1,"Gai");
if ( powerOfThree->yi > M )
strcpy(s2,"Cong");
else if ( powerOfThree->yi == M )
strcpy(s2,"Ping");
else
strcpy(s2,"Gai");
if ( powerOfThree->bin > M )
strcpy(s3,"Cong");
else if ( powerOfThree->bin == M )
strcpy(s3,"Ping");
else
strcpy(s3,"Gai");
printf("%d %s %s %s\n", powerOfThree->jia, s1, s2, s3);
} else {
printf("No Solution\n");
}
return EXIT_SUCCESS;
}
改进后的代码
从高到低遍历,找到第一个符合条件的值就可以中断了。后面的判断也用宏来实现,简洁了许多
#include <stdio.h>
#include <stdlib.h>
#define JUDGE(o,m) o>m ? "Cong" : (o==m ? "Ping" : "Gai")
int main(int argc, const char *argv[]) {
int M, X, Y, a, b, flag = 0;
double c;
if ( scanf("%d%d%d", &M, &X, &Y)==EOF ) printf("error\n");
for ( a=99; a>=10; --a ) {
b = a%10*10 + a/10;
if ( (double)abs(a-b)/X == (double)b/Y ) {
c = (double)b/Y; //一开始翻车了,明明上一行都知道要用double,结果这里却忘了
flag = 1;
break;
}
}
if ( flag )
printf("%d %s %s %s\n", a, JUDGE(a,M), JUDGE(b,M), JUDGE(c,M));
else
printf("No Solution\n");
return EXIT_SUCCESS;
}