题目链接https://www.nowcoder.com/acm/contest/91/I
思路:从左往右扫,发现第一个奇数,要特判第一个为9的情况。然后比第一个奇数大的让其后面的奇数全为0;比第一个奇数小的让其后面全为8。
判断原来的数后面是否大于444.....444。如果大于那么就选第一个数,否则选第二个数。
1 /*
2 代码写丑了
3 */
4 #include<iostream>
5 #include<string>
6 #include<string.h>
7 #include<algorithm>
8 #include<stdio.h>
9 using namespace std;
10 bool cmp(string a,int num){
11 for(int i=num;i<a.length();i++){
12 if(a[i]=='4'){
13 continue;
14 }else if(a[i]>'4'){
15 return false;
16 }else{
17 return true;
18 }
19 }
20 return true;
21 }
22 int main(){
23 int n;
24 cin>>n;
25 while(n--){
26 string a;
27 cin>> a;
28 char ans1[100500];
29 memset(ans1,0,sizeof(ans1));
30 char ans2[100500];
31 memset(ans2,0,sizeof(ans2));
32 int flag=0;
33 for(int j=0;j<a.length();j++){
34 if(flag==0&&a[j]=='9'){
35 flag=1;
36 for(int i=j;i<a.length();i++){
37 if(a[i]=='9'){
38 ans1[i]='8';
39 }else if((a[i]-'0')%2){
40 ans1[i]='8';
41 }else{
42 ans1[i]='8';
43 }
44 }
45 int t=0;
46 for(int i=0;i<strlen(ans1);i++){
47 if(t==0&&i<strlen(ans1)-1&&ans1[i]=='0'){
48 continue;
49 }else{
50 t=1;
51 cout<<ans1[i];
52 }
53 }
54 cout<<endl;
55 break;
56 }else if(flag==0&&(a[j]-'0')%2){
57 flag=1;
58 ans1[j]=char(a[j]-1);
59 ans2[j]=char(a[j]+1);
60 for(int i=j+1;i<a.length();i++){
61 if(a[i]=='9'){
62 ans1[i]='8';
63 ans2[i]='0';
64 }else if((a[i]-'0')%2){
65 ans1[i]='8';
66 ans2[i]='0';
67 }else{
68 ans1[i]='8';
69 ans2[i]='0';
70 }
71 }
72 bool fg=cmp(a,j+1);
73 int t=0;
74 if(fg){
75 for(int i=0;i<strlen(ans1);i++){
76 if(t==0&&i<strlen(ans1)-1&&ans1[i]=='0'){
77 continue;
78 }else{
79 t=1;
80 cout<<ans1[i];
81 }
82 }
83 cout<<endl;
84 }else{
85 for(int i=0;i<strlen(ans2);i++){
86 if(t==0&&i<strlen(ans2)-1&&ans2[i]=='0'){
87 continue;
88 }else{
89 t=1;
90 cout<<ans2[i];
91 }
92 }
93 cout<<endl;
94 }
95 break;
96 }else{
97 ans1[j]=a[j];
98 ans2[j]=a[j];
99 }
100 }
101 if(flag==0){
102 for(int i=0;i<a.length();i++){
103 cout<<a[i];
104 }
105 cout<<endl;
106 }
107 }
108 return 0;
109 }