二數 上海五校賽I
阿新 • • 發佈:2019-02-19
題目描述
我們把十進位制下每一位都是偶數的數字叫做“二數”。 小埃表示自己很聰明,最近他不僅能夠從小數到大: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; } } }