1. 程式人生 > >二數 上海五校賽I

二數 上海五校賽I

題目描述

我們把十進位制下每一位都是偶數的數字叫做“二數”。 小埃表示自己很聰明,最近他不僅能夠從小數到大:2,3,4,5....,也學會了從大數到小:100,99,98...,他想知道從一個數開始數最少的數就得到一個二數。但是聰明的小森已經偷偷在心裡算好了小埃會數到哪個二數,請你求出他要數到哪個數吧。
換句話說,給定一個十進位制下最多105位的數字,請你求出和這個數字的差的絕對值最小的二數,若答案不唯一,輸出最小的那個。 也就是說,給定數字n,求出m,使得abs(n-m)最小且m[i] mod 2 = 0

輸入描述:

1 ≤ T ≤ 100, 1 ≤ n ≤ 10100000 − 1, T組資料的數字的十進位制表示長度總和不超過1000000

輸出描述:

每行一個整數 m 第 i 行表示第 i 個數所對應的“最鄰近二數”
#include<iostream>
#include<string>
using namespace std;
int main()
{
	int T;
	cin >> T;
	string s;
	while ( T-- )
	{
		cin >> s;
		int k = 0, x = -1;
		while ( k < s.size() ) //從前往後遍歷
		{
			if ( ( s[k] - '0' ) % 2 == 0 )
			{  k++;  continue;  }  //偶數
			//奇數則當前位+1或-1
			//+1 之後位均為0;-1 之後位均為8
			if ( s[k] == '9' ) //9 特判 只能減1 加則至2
				s[k] -= 1, x = '8';
			else  //1 3 5 7
			{
				for ( int i = k + 1; i < s.size(); i++ ) //之後的每位
					if ( s[i] != '4' ) //==4時至-8和至+10相等 均為6
					{
						if ( s[i] > '4' )
							s[k] += 1, x = '0';  //加更接近
						else
							s[k] -= 1, x = '8';  //減更接近
						break;
					}  //==4 判斷下一位
				if ( x == -1 )
					s[k] -= 1, x = '8';
				//均為4 取較小的減操作
			}
			break;
		}
		//k是第一個奇數
		while ( k < s.size() - 1 )
			s[++k] = x;
		int f = ( s.size() > 1 && s[0] == '0' ) ? 1 : 0;
		//判斷首位是否為0
		if ( !f )
			cout << s << endl;
		else
		{
			for ( int i = 1; i < s.size(); i++ )
				cout << s[i];
			cout << endl;
		}
	}
}