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";
}

posted on 2021-09-21 14:58  Atl212  阅读(101)  评论(0)    收藏  举报

导航