金马五校赛 I : 二数

题目链接:点击打开链接

大意:

给定一个十进制下最多105位的数字,请你求出和这个数字的差的绝对值最小的二数,若答案不唯一,输出最小的那个。
也就是说,给定数字n,求出m,使得abs(n-m)最小且m[i] mod 2 = 0

思路:思路很好想,主要是细节,直接上代码吧。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<iostream>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#define FAST ios::sync_with_stdio(false)
typedef long long ll;
const int maxn = 1000005;
using namespace std;

char a[maxn];
int b[maxn];

int main()
{
	FAST;
	int t;
	cin >> t;
	while(t--){
		cin >> a;
		int len = strlen(a);
		for(int i = 0; i < len; i++){
			b[i] = a[i] - '0';
		}
		if(len == 1){
			b[0] & 1 ? cout << b[0] - 1 << endl : cout << b[0] << endl;
		}
		else{
		int pos = len, x;
		for(int i = 0; i < len; i++){
			if(b[i] & 1){
				pos = i;
				x = b[i];
				break;
			}
		}
		if(x == 9){
			for(int i = pos; i < len; i++){
				b[i] = 8;
			}
		}
		else{
			bool flag = false;
			for(int i = pos + 1; i < len; i++){
				if(b[i] > 4) { flag = true; break;}
				if(b[i] < 4)  break;
				//if(b[i] == 4) continue;
			}
			if(flag){
				b[pos]++;
				for(int i = pos + 1; i < len; i++){
					b[i] = 0;
				}
			}
			else{
				b[pos]--;
				for(int i = pos + 1; i < len; i++){
					b[i] = 8;
				}
			}
		}
		int pos2;
		for(int i = 0; i < len; i++){
			if(b[i]){
				pos2 = i;
				break; 
			}
		}
		for(int i = pos2; i < len; i++){
			cout << b[i];
		}
		cout << endl;
		}
	}
	return 0;
}
over
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页