【Nowcoder 上海五校赛】二数

题目描述:

我们把十进制下每一位都是偶数的数字叫做“二数”。

小埃表示自己很聪明,最近他不仅能够从小数到大: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 个数所对应的“最邻近二数”

[示例1]

输入

5
42
11
1
2018
13751

输出

42
8
0
2020
8888

题解

① 找到该数的最高位的奇数,若无奇数可以直接输出

② 然后依次判断以下三种情况:

  ⑴如果最高奇位的值为9,把包括最高奇位在内的每一位数字都变成8

  ⑵如果这个数除最高奇位外,有一位数≤4,则最高奇位的值-1,之后的低位全变为8

  ⑶如果这个数除最高奇位外,有一位数>4,最高奇位的值+1,之后的低位全变为0

③ 注意去除前导0

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
char a[N];
int main()
{
    int i,j,t,flag;
    cin>>t;
    while(t--)
    {
        flag=0;
        scanf("%s",a+1);
        for(i=1;a[i];i++)
        {
            if(a[i]==‘9‘)
            {
                for(j=i;a[j];j++)
                    printf("8");
                break;
            }
            else if((a[i]-‘0‘)%2==1)
            {
                for(j=i+1;a[j];j++)
                {
                    if(a[j]>‘4‘)
                    {
                        flag=1;
                        break;
                    }
                    else if(a[j]<‘4‘)
                        break;
                }
                if(flag)
                {
                    printf("%c",a[i]+1);
                    for(j=i+1;a[j];j++)
                        printf("0");

                    break;
                }
                else if(!flag)
                {
                    if(i==1)                             //如果改变的最高奇位在第一位
                    {
                        if(a[i]-1!=‘0‘||a[i+1]==‘\0‘)    //而且第一位不为0且输入的数是个位
                            printf("%c",a[i]-1);
                    }
                    else printf("%c",a[i]-1);            //如果改变的最高奇位不是第一位就直接输出 

                    for(j=i+1;a[j];j++)
                        printf("8");
                    break;
                }
            }
            else printf("%c",a[i]);
        }
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/kannyi/p/8869681.html

时间: 2024-11-07 23:32:46

【Nowcoder 上海五校赛】二数的相关文章

【Nowcoder 上海五校赛】Wasserstein Distance

题目描述 最近对抗生成网络(GAN)很火,其中有一种变体WGAN,引入了一种新的距离来提高生成图片的质量.这个距离就是Wasserstein距离,又名铲土距离. 这个问题可以描述如下: 有两堆泥土,每一堆有n个位置,标号从1~n.第一堆泥土的第i个位置有ai克泥土,第二堆泥土的第i个位置有bi克泥土.小埃可以在第一堆泥土中任意移挪动泥土,具体地从第i个位置移动k克泥土到第j个位置,但是会消耗的体力.小埃的最终目的是通过在第一堆中挪动泥土,使得第一堆泥土最终的形态和第二堆相同,也就是ai=bi (

上海五校赛 密码破解

密码破解 发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:04   时间限制: 1000ms   内存限制: 128M 描述 近日来勒索病毒的事件频繁发生,小Y对它的加密原理非常感兴趣,研究了一番相关知识之后,他就来给你看他的加密程序,并给你一段密文,和你炫耀说就算把程序给你看你也破解不出来. 你扫了一眼代码发现加密的公式为b=a e %m  ,其中e  是质数. 进一步分析发现m=p∗q  ,p  和q  都为质数,p!=q  , 作为一个计算机高手,你早

上海五校赛 零件组装

零件组装 发布时间: 2017年7月9日 18:17   最后更新: 2017年7月9日 21:04   时间限制: 1000ms   内存限制: 128M 描述 现有n  个零件,小Y花费了很多时间来收集它们,现在他想把零件拼在一起,拼完就可以召唤神龙了.已知零件之间存在相邻的关系,拥有相邻关系的零件在最终的组装结果中就是相邻的,并且组装过程中每次只能通过相邻关系来组合零件.小Y每次可以选择两个零件(也可以是两个零件块,或一个零件与一个零件块)拼起来,成为一个零件块,但要求拼接时必须在两个零件

Nowcoder 北师校赛 B 外挂使用拒绝 ( k次前缀和、矩阵快速幂打表找规律、组合数 )

题目链接 题意 : 中文题.点链接 分析 : 有道题是问你不断求前缀和后的结果 Click here 这道题问的是逆过程 分析方法雷同.可参考 Click here -------------------------------------------------------------------------------- 正着做的矩阵是一个下三角 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 结合杨辉三角可得 C(k, 0) C(k+1, 1)      C(k, 0) C

[第十届校赛]简单总结

这次校赛其实是抱着比较大的期望来打的,首先我是单挑,好像自从去年蓝桥杯后就没有一个人做过比赛,一般都是组队做,这次单挑,是想测测自己的水平和对节奏的把握,也有夺冠的冲动,很可惜,整体上是失败了TAT.如果一开始就稳扎稳打,说不定真的可以题数碾压.. 做完胡老师出的三个水题后,交了一发卡精度的二分,节奏就开始乱了.首先我自认为我的思路很正确,并且已经将误差降到很低了,但陆陆续续wa了7发,wa的原因自然是精度问题.大概比赛结束前2个小时,我把精度加大了一位,居然奇迹般的过了,无语..我一直以为比目

CSU 1425 NUDT校赛 I题 Prime Summation

这个题本来有希望在比赛里面出了的 当时也想着用递推 因为后面的数明显是由前面的推过来的 但是在计算的时候 因为判重的问题 ...很无语.我打算用一个tot[i]来存i的总种树,tot[i]+=tot[j]//j为可以由j推到i的一系列数,但这样是不对的,会产生大量重复计算... 看了下标程才发现要用二维来计算出种类总数,f[i][j]+=sum(f[i-j][k]) 表示在推i数的时候,第一个素数为j的种类数,注意j一定为素数,而且k不能大于j...标程里面处理的比较简练,就学了下他的写法. 至

2016 年宁波工程学院第七届ACM校赛题解报告

2016 年宁波工程学院第七届ACM校赛题解报告 本题解代码直接为比赛代码,仅供参考. A,B,C,D,G,H,J,K,L,M 来自 Ticsmtc 同学. F 来自 Gealo 同学. E,I 来自Alex 学长. Promblem A :    Two Sum 时间限制: 1 Sec  内存限制: 64 MB 题目描述: 给出n个数,另外给出?个整数S,判断是否可以从中取出2个数,使得这两个数的和是S. 输入: 第?行有个整数T(1 <= T <= 10),代表数据组数. 对于每组数据,第

记一次校赛。。

收到的短信是11点45分签到的,比赛是12点开始,4点结束.而我的外卖竟然11点32分才到.无奈之下,随意几口,11点37分之后开始猛冲SL一楼.之后就进入了机房,找到了自己的位置,开始调试编译器..说实话,我很不习惯那键盘,用那键盘打代码速度起码下降4分之一.到了11点55分之后,一些学姐学长和工作人员都在强调一些纪律,并且准备气球(做一道题给你插上一个气球).而我的内心,已经十分的紧张了,不仅是因为那种气氛,并且我的前两次热身赛都没有很理想,经常被一道坑题卡很久很久,导致我没有去做其它的题目

2014NYIST校赛ACM-ICPC竞赛环境的配置(PC^2)总结

个人感觉这次比赛环境的搭建不是很成功.而且为了搭建其比赛的环境也是一波多则.但是后来还是逐一解决了问题.在比赛开始前算是解决了主要的大部分问题,但是还有一个最重要的问题在比赛时候一直没有解决.赛后自己通过不断的总结反思和查阅资料才发现了问题的所在.对于那些因为我的环境搭配错误而可能正确A题的同学深感抱歉~ 先解决主要问题为什么会出现环境搭配的致命性错误因为,从这次比赛之前自己都没有独立搭建过比赛环境.而这次也是临时学习.而且就自己一个人独自配置,很多问题出现了不知道如何处理.最后跟人能力有限导致