fork download
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<inttypes.h>
  4. #include<string.h>
  5. #include<stdbool.h>
  6. #include<assert.h>
  7.  
  8. #define STRING_LENGTH 1000002
  9.  
  10. bool check_palindrome(char[]);
  11. bool check_all_nines(char[]);
  12. void find_next_palindrome(char[]);
  13.  
  14. int main(void) {
  15. uint64_t test;
  16. scanf("%"SCNu64,&test);
  17. assert(test > 0);
  18. while(test--) {
  19. char number_base_10[STRING_LENGTH];
  20. scanf("%s",number_base_10);
  21. uint32_t string_len = strlen(number_base_10);
  22. assert(string_len > 0);
  23. if(check_all_nines(number_base_10)) {
  24. for(uint32_t i=0;i<=string_len;++i) {
  25. if(i == 0 || i == (string_len)) {
  26. number_base_10[i] = '1';
  27. } else {
  28. number_base_10[i] = '0';
  29. }
  30. }
  31. string_len++;//as len increases by 1
  32. } else {
  33. find_next_palindrome(number_base_10);
  34. }
  35. //puts(number_base_10);
  36. for(int i=0;i<string_len;i++)
  37. {
  38. printf("%c",number_base_10[i]);
  39. }
  40. printf("\n");
  41. memset(number_base_10,'\0',sizeof(char)*STRING_LENGTH);
  42. }
  43. return 0;
  44. }
  45.  
  46. bool check_all_nines(char number[]) {
  47. bool is_all_nines = true;
  48. for(uint32_t i=0;number[i]!='\0';++i) {
  49. if(!(number[i] == '9')) {
  50. is_all_nines = false;
  51. break;
  52. }
  53. }
  54. return is_all_nines;
  55. }
  56.  
  57. bool check_palindrome(char number[]) {
  58. bool is_palindrome = true;
  59. for(uint32_t start = 0,end = (strlen(number) - 1);(start < end);++start,--end) {
  60. if(!(number[start] == number[end])) {
  61. is_palindrome = false;
  62. break;
  63. }
  64. }
  65. return is_palindrome;
  66. }
  67.  
  68. void find_next_palindrome(char number[]) {
  69. uint32_t str_len = strlen(number);
  70. if(check_palindrome(number)) {
  71. uint32_t start,mid,end;
  72. start = 0;
  73. end = str_len - 1;
  74. mid = ((end - start) >> 1) + start;
  75. for(start = mid,(end = (str_len & 1) ? mid : (mid + 1)); (start >= 0 && end < str_len) && (number[start] == '9'); --start,++end) {
  76. number[end] = number[start] = '0';
  77. }
  78. if(start >= 0 && end < str_len) {
  79. number[start]++;
  80. number[end] = number[start];
  81. }
  82. } else {
  83. uint32_t start,mid,end;
  84. bool flag = false;
  85. start = 0;
  86. end = str_len - 1;
  87. mid = ((end - start) >> 1) + start;
  88. for(start = mid, end = ((str_len & 1) ? mid: (mid + 1)); (start >=0 && end < str_len) && (number[start] == number[end]); --start,++end);
  89. if(number[start] < number[end]) {
  90. flag = true;
  91. number[end] = number[start];
  92. }
  93. if(flag) {
  94. for(start = mid, end = ((str_len & 1) ? mid : (mid + 1)); (start >=0 && end < str_len) && (number[start] == '9'); --start,++end) {
  95. number[end] = number[start] = '0';
  96. }
  97. if(start >=0 && end < str_len) {
  98. number[start]++;
  99. number[end] = number[start];
  100. }
  101. }
  102. for(start = 0, end = str_len - 1; (start < end); ++start,--end) {
  103. number[end] = number[start];
  104. }
  105. }
  106. }
Success #stdin #stdout 0s 4392KB
stdin
5
9091
99
999
999999
213
stdout
9119
101
1001
1000001
222