翻转数位
原题链接:http://codeforces.com/problemset/problem/514/A
【题目描述】
给你一个数字 a ,你可以对这个数字进行无数次操作,每次操作你可以选择这个数字某一位上的数 t ,将 t 转换为 9-t 。
比如,给你一个数字 27,你对这个数字进行若干次操作(当然操作次数也可以是0)之后能得到的转换后的数字包括:22,27,72,77。
你需要找出对于一个数字 a ,你可以将其进行转换得到的最小的结果。(比如对于数字 77 ,能得到的最小的结果就是 22 )。
【输入格式】
输入一个数字 a (1<=a<=10^18)。
【输出格式】
输出一个数字,用于表示能够将 a 进行转换的最小结果。
注意:转换的结果不能以0开头。这意味着,如果 a 的最高位上是数字 9,那么不能对齐进行转换。
【样例输入1】
27
【样例输出1】
22
【样例输入2】
4545
【样例输出2】
4444
【题目分析】
逐个分析每一位上面的数字 t ,如果 t >= 5 , 则将这一位上的数字转换为 9-t 。
如果 a 的最高位上是数字 9,那么不能对齐进行转换。在这种情况下,使用字符串模拟会变得很方便。
实现代码如下:
#include <bits/stdc++.h> using namespace std; const int maxn = 100010; void transfer(char &c) { int a = c - '0'; if (a >= 5) a = 9 - a; c = '0' + a; } string s; int main() { cin >> s; int len = s.length(); for (int i = 0; i < len; i ++) { if (!i && s[i] < '9' || i && s[i] >= '5') transfer(s[i]); } cout << s << endl; return 0; }