fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. // 文字列の長さを求める関数
  5. int myStrlen(char s[]) {
  6. int i;
  7. for (i = 0; s[i] != '\0'; i++);
  8. return i;
  9. }
  10.  
  11. // 最短回文を作成する関数
  12. char *setPalindrome(char s[]) {
  13. int len = myStrlen(s);
  14. int i, j;
  15.  
  16. // 最長回文前半部分を見つける
  17. for (i = 0; i < len; i++) {
  18. int is_palindrome = 1;
  19. for (j = 0; j < len - i; j++) {
  20. if (s[j] != s[len - i - 1 - j]) {
  21. is_palindrome = 0;
  22. break;
  23. }
  24. }
  25. if (is_palindrome) {
  26. break;
  27. }
  28. }
  29.  
  30. // 回文を格納するためのメモリ確保
  31. char *tmp = (char *)malloc((2 * len - i + 1) * sizeof(char));
  32. if (tmp == NULL) {
  33. printf("Memory allocation failed\n");
  34. exit(1);
  35. }
  36.  
  37. // 文字列の前半部分をそのままコピー
  38. for (j = 0; j < len; j++) {
  39. tmp[j] = s[j];
  40. }
  41.  
  42. // 後半部分を反転して追加
  43. for (j = len - i - 1; j >= 0; j--) {
  44. tmp[len + (len - i - 1 - j)] = s[j];
  45. }
  46.  
  47. tmp[2 * len - i] = '\0'; // 終端文字を追加
  48.  
  49. return tmp;
  50. }
  51.  
  52. int main() {
  53. char nyuryoku[1024]; // 入力用の配列
  54. char *kaibun; // 回文を受け取る
  55.  
  56. // 入力を取得
  57. scanf("%s", nyuryoku);
  58.  
  59. // 最短回文を生成
  60. kaibun = setPalindrome(nyuryoku);
  61.  
  62. // 結果を表示
  63. printf("%s\n -> %s\n", nyuryoku, kaibun);
  64.  
  65. // メモリの解放
  66. free(kaibun);
  67. return 0;
  68. }
  69.  
Success #stdin #stdout 0.01s 5268KB
stdin
abab
stdout
abab
  -> abababa