OCAC暑期比赛第二场 H题 翻转数位 题解

翻转数位
原题链接: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;
}

猜你喜欢

转载自www.cnblogs.com/ocac/p/11131660.html
今日推荐