fork(1) download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. #include <unistd.h>
  6.  
  7. char *nozeros(char *s){
  8. int i;
  9. for(i=0; i<strlen(s); i++){
  10. if(s[i] != '0')
  11. break;
  12. }
  13. return s+i;
  14. }
  15.  
  16. int all9(char *s){
  17. for(int i=0; i<strlen(s); i++){
  18. if(s[i] != '9')
  19. return 0;
  20. }
  21. return 1;
  22. }
  23.  
  24. void incrementFromMiddle(char *s, int pos){
  25. int len = strlen(s);
  26. for(int i=pos; i>=0; i--){
  27. if(s[i] != '9'){
  28. s[i] += 1;
  29. s[(len%2 == 0)?len-i-1:len-i] = s[i];
  30. break;
  31. }
  32. s[i] = '0';
  33. s[(len%2 == 0)?len-i-1:len-i] = s[i];
  34. }
  35. }
  36.  
  37. int main(){
  38. int t;
  39. scanf("%i", &t);
  40. while(t--){
  41. char s[1000000];
  42. scanf("%s", s);
  43. char *ptr = nozeros(s);
  44. int len = strlen(ptr);
  45. if(all9(ptr)){
  46. memset(ptr, '0', len);
  47. ptr[0] = '1';
  48. ptr[len] = '1';
  49. ptr[len + 1] = '\0';
  50. printf("%s\n", ptr);
  51. continue;
  52. }
  53. for(int i=len-1; i>=0; i--){
  54. if(ptr[i] != '9'){
  55. ptr[i] += 1;
  56. break;
  57. }
  58. ptr[i] = '0';
  59. }
  60. short firstTime=1;
  61. short odd = len % 2;
  62. int midpoint = floor(len / 2);
  63. int start = (odd)? midpoint+1 : midpoint;
  64. for(int i=start; i<len; i++){
  65. if(ptr[i] == ptr[len - i - 1]){
  66. continue;
  67. }
  68. if(ptr[i] > ptr[len - i - 1] && firstTime == 1){
  69. if(odd)
  70. incrementFromMiddle(ptr, midpoint);
  71. else
  72. incrementFromMiddle(ptr, midpoint-1);
  73. }
  74. ptr[i] = ptr[len - i - 1];
  75. firstTime = 0;
  76. }
  77. printf("%s\n", ptr);
  78. }
  79. return 0;
  80. }
Success #stdin #stdout 0s 4872KB
stdin
8
999999
2133
808
96329892369
1234599974332
349999954
4578998754
000314789
stdout
1000001
2222
818
96329992369
1234600064321
350000053
4579009754
315513