「PAT乙级真题解析」Basic Level 1079 延迟的回文数 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求将一个不是回文数的数转换为回文数,并且给出了具体的转换步骤,看到给出了具体的步骤,我们就知道这是一道模拟题。 具体步骤会将给定的数值各个数位上的数字逆序排列得到另一个数,然后两数相加得到新的数值。 重复上述过程直到得到回文数或者操作次数达到10次认为转换失败。

#算法#数据结构#需求分析#pat考试#c语言

Table of Contents

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT (Basic Level) Practice 1079 延迟的回文数

问题分析

题设要求将一个不是回文数的数转换为回文数,并且给出了具体的转换步骤,看到给出了具体的步骤,我们就知道这是一道模拟题。 具体步骤会将给定的数值各个数位上的数字逆序排列得到另一个数,然后两数相加得到新的数值。 重复上述过程直到得到回文数或者操作次数达到10次认为转换失败。

如何将数值的各个数字逆转

如果是存储成整数类型, 则可以通过不断取余得到各个数位上的数字然后得到逆转的结果。 但是题设说明给定正整数不会超过1000位, 这超过了整型的表示范围, 所以这里应该存储成字符数组(字符串)

在C语言中, 逆转字符串只需要新建一个等长的字符数组, 然后将原字符串索引为index的字符放到新数组中size-index-1的位置

如何相加两个字符形式的大数

如果这里相加的两个数是数位逆转的关系,所以两个字符串长度一致。主要需要考虑最高位相加后需要进位的情况。 我们需要将每一个的字符转为成数字相加后再加上是否有从低位进位需要再加1. 如果处理完每一个数位后, 记录进位情况的记录器提示最高位需要进位, 则先将每一位往后移然后将第一位置为'1'

完整描述步骤

  1. 获取输入: 给定的正整数A
  2. 计算逆转后的正整数B
  3. 相加两个正整数C
  4. 输出计算过程: A + B = C
  5. 检查结果C是否是回文数
  6. 如果结果C是回文数, 则输出"{C} is a palindromic number."并结束程序
  7. 否则将C的值赋给A然后重复上述步骤并记录重复次数
  8. 如果重复次数达到10次, 输出"No found in 10 iterations."

伪代码描述

  1. get input: A
  2. for time in range(10):
    • calculate B: B[size - index - 1] = A[index];
    • calculate C = A + B;
    • print("{A} + {B} = {C}")
    • if C is palindromic:
      • print("{C} is palindromic number.")
      • end procedure
    • A = C
  3. print("Not found in 10 iterations.")

完整提交代码

/*
# 问题分析
题设要求将一个不是回文数的数转换为回文数,并且给出了具体的转换步骤,看到给出了具体的步骤,我们就知道这是一道模拟题。
具体步骤会将给定的数值各个数位上的数字逆序排列得到另一个数,然后两数相加得到新的数值。
重复上述过程直到得到回文数或者操作次数达到10次认为转换失败。
 
## 如何将数值的各个数字逆转
如果是存储成整数类型, 则可以通过不断取余得到各个数位上的数字然后得到逆转的结果。
但是题设说明给定正整数不会超过1000位, 这超过了整型的表示范围, 所以这里应该存储成字符数组(字符串)
 
在C语言中, 逆转字符串只需要新建一个等长的字符数组, 然后将原字符串索引为index的字符放到新数组中size-index-1的位置
 
## 如何相加两个字符形式的大数
如果这里相加的两个数是数位逆转的关系,所以两个字符串长度一致。主要需要考虑最高位相加后需要进位的情况。
我们需要将每一个的字符转为成数字相加后再加上是否有从低位进位需要再加1.
如果处理完每一个数位后, 记录进位情况的记录器提示最高位需要进位,
则先将每一位往后移然后将第一位置为'1'
 
# 完整描述步骤
1. 获取输入: 给定的正整数A
2. 计算逆转后的正整数B
3. 相加两个正整数C
4. 输出计算过程: A + B = C
5. 检查结果C是否是回文数
6. 如果结果C是回文数, 则输出"{C} is a palindromic number."并结束程序
7. 否则将C的值赋给A然后重复上述步骤并记录重复次数
8. 如果重复次数达到10次, 输出"No found in 10 iterations."
 
# 伪代码描述
1. get input: A
2. for time in range(10):
    - calculate B: B[size - index - 1] = A[index];
    - calculate C = A + B;
    - print("{A} + {B} = {C}")
    - if C is palindromic:
        - print("{C} is palindromic number.")
        - end procedure
    - A = C
3. print("Not found in 10 iterations.")
*/
 
#include<stdio.h>
#include<string.h>
 
int is_palindromic_number(char* number){
    int size = strlen(number);
    int left = 0, right = size - 1;
    while (left <= right){
        if (number[left] != number[right]){
            return 0;
        }
        left++;
        right--;
    }
    return 1;
}
 
void reverse_number(char* number, char* reversed_number){
    int size = strlen(number);
    reversed_number[size] = 0;
    for (int i = 0; number[i]; i++){
        reversed_number[size - 1 - i] = number[i];
    }
}
 
void add_numbers(char* number_1, char* number_2, char* result){
    int carry = 0;
    int size = strlen(number_1);
    result[size] = 0;
    int sum = 0;
    for (int i = size - 1; i >= 0; i--){
        sum = (number_1[i] - '0') + (number_2[i] - '0') + carry;
        carry = sum / 10;
        result[i] = sum % 10 + '0';
    }
    if (carry == 1){
        for (int i = size; i >= 0; i--){
            result[i+1] = result[i];
        }
        result[0] = '1';
    }
}
 
int main(){
    char number[10010];
    char reversed_number[10010];
    char sum[10010];
    
    scanf("%s", number);
    for (int i = 0; i < 10; i++){
        if (is_palindromic_number(number) == 1){
            printf("%s is a palindromic number.\n", number);
            return 0;
        }
        reverse_number(number, reversed_number);
        add_numbers(number, reversed_number, sum);
        printf("%s + %s = %s\n", number, reversed_number, sum);
        strcpy(number, sum);
    }
 
    printf("Not found in 10 iterations.\n");
    return 0;
}
「PAT乙级真题解析」Basic Level 1079 延迟的回文数 (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果