1088 三人行 (20 point(s)) (测试点四)
-
两位正整数只到 10 不包括 0 ~ 9 。
-
前面获取 A B C 的部分确实考虑了 double 的精度问题。但是最后还是卡了测试点四,参考很多其他的文章也说了要考虑 C 丙是 double 的可能,但在定义 C 时可以看到确实是 double 类型。
后面想了想,除了获取 C 的部分,哪个部分还需要考虑到 C 的类型的问题,或者说哪里还需要用到 C 。将整个代码看了看,首先是判断条件成立的部分,参考其他文章也是这样写的,这部分没问题。
而看到函数部分就明白了,忘记考虑参数类型, 是 double 而不是 int ,这可能导致 C 传递过去的时向下取整,导致判断错误。改了之后就 AC 了。
测试点四 (文章里以对话来描述的方式很有意思)
-
这里将 A 逆转成 B 用了字符串和 reverse() 函数。
最开始想到了取基求余法的,但是写了一下后发现,辗转相除法是从低位到高位的,而逆转需要从高位到低位,顺序相反。所以想了想就没再用这个思路。
而看了别人的参考后发现手动求余的方式,也可以将高低位的顺序逆转,因为位数比较小只有两位,所以直接求余和除就可以得到个位和十位上的数了。
这可以让代码化简一点,不用转换 string 逆转后再转为 int 。
B = A % 10 * 10 + A / 10;
// AC
#include <bits/stdc++.h>
using namespace std;
void cmp(double n, double m){
if(n > m){ cout << " Cong"; return ;}
if(n == m){ cout << " Ping"; return ;}
if(n < m){ cout << " Gai"; return ;}
}
int main() {
int M, X, Y;
double A, B, C;
cin >> M >> X >> Y;
for(int A = 99; A >= 10; A--){
B = A % 10 * 10 + A / 10;
C = B / Y;
if(abs(A - B) == C * X){
cout << (int)A;
cmp(A, M), cmp(B, M), cmp(C, M);
return 0;
}
}
// 遍历完条件都不满足则无解
cout << "No Solution";
}
// 18 points
#include <bits/stdc++.h>
using namespace std;
int getB(int A){
string a = to_string(A);
reverse(begin(a), end(a));
return stoi(a);
}
void cmp(int n, int m){
if(n > m){ cout << " Cong"; return ;}
if(n == m){ cout << " Ping"; return ;}
if(n < m){ cout << " Gai"; return ;}
}
int main() {
int M, X, Y;
double A, B, C;
cin >> M >> X >> Y;
for(int A = 99; A > 0; A--){
B = getB(A);
C = B / Y;
if(abs(A - B) == C * X){
cout << (int)A;
cmp(A, M), cmp(B, M), cmp(C, M);
return 0;
}
}
// 遍历完条件都不满足则无解
cout << "No Solution";
}
浙公网安备 33010602011771号