PAT 1024 Palindromic Number (25分) 使用string类reverse()

本文介绍了一种算法,用于将任意正整数通过特定操作转换成回文数,并计算所需步骤。回文数是指正读反读都一样的数字,如1234321。对于非回文数,可通过自身与其反转数相加的方式逐步逼近回文数。文章详细解释了处理流程,包括判断回文、数值转换及求和方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

A number that will be the same when it is written forwards or backwards is known as a Palindromic Number. For example, 1234321 is a palindromic number. All single digit numbers are palindromic numbers.

Non-palindromic numbers can be paired with palindromic ones via a series of operations. First, the non-palindromic number is reversed and the result is added to the original number. If the result is not a palindromic number, this is repeated until it gives a palindromic number. For example, if we start from 67, we can obtain a palindromic number in 2 steps: 67 + 76 = 143, and 143 + 341 = 484.

Given any positive integer N, you are supposed to find its paired palindromic number and the number of steps taken to find it.

Input Specification:
Each input file contains one test case. Each case consists of two positive numbers N and K, where N (≤10​10​​ ) is the initial numer and K (≤100) is the maximum number of steps. The numbers are separated by a space.

Output Specification:
For each test case, output two numbers, one in each line. The first number is the paired palindromic number of N, and the second number is the number of steps taken to find the palindromic number. If the palindromic number is not found after K steps, just output the number obtained at the Kth step and K instead.

Sample Input 1:
67 3
Sample Output 1:
484
2
Sample Input 2:
69 3
Sample Output 2:
1353
3

题目解读

1234321 这种左右对称的数字称为 palindromic number,但是一个非回文数可以经过转换得到一个回文数:反转自己,自己加上反转后的自己,得到新的数。重复这个过程,知道得到的数字是一个回文数。

给你一个非回文数字N和最大转换次数K,让你计算把它转为一个回文数字需要几步,输出 最终得到的回文数和转换次数;如果经过了K次转换后得到的还不是一个回文数,那么就输出 第K次转换的结果和K

思路分析

这个题目没什么难度,就重复这个过程

  1. 判断是否回文
  2. 若是回文数或者转换次数达到上限就输出结果
  3. 若不是回文数就反转自己,自己加上反转后的自己,转换次数+1

我们只需要考虑,如何存储这个数字,如何判断回文,如何反转就好:

  • 如何存储,题目说了N最大为1010,转换次数最多为100,所以int会溢出的,我们可以考虑 char[] 或者 string;
  • 因为要反转,所以选择string sreverse(s.begin(), s.end()); 一步搞定,所以longlong long 我们也没有考虑。
  • 求和,本来两个数相加需要右对齐,然后从右往左对应位置数字相加,保留%10的数字,如有进位就向前进位。但是现在 s + ttsreverse(),所以对齐不用考虑,也不用从右往左,就从左往右, 345 + 543543 + 345 没啥区别啊,但是有个地方要注意,如果是从左往右相加,最终的进位就进到最右面去了,但实际上进位方向是要想左,所以我们最终要再反转一下才能得到结果

问题解决完了我们来看代码吧

最终代码

因为 s 一直要改变,所以直接用一个全局 string s 存储即可。

#include <iostream>
#include <algorithm>
using namespace std;

// 题目说N的长度 <= 10,所以int 和 longlong 都无法存储,而且反转不好处理
// 用字符串
// 这个数字一直在增加,所以用全局变量保存
string s;

// 计算 s + s.reverse()
// 因为 t 是 s 反转得到的,所以 正着加和倒着加没什么区别,只需要最后再反转一次就好
void add(string t) {
    int len = s.length();
    // 进位
    int carry = 0;
    for (int i = 0; i < len; ++i) {
        // int n1 = s[i] - '0', n2 = t[i] - '0'
        // sum = n1 + n2 + carry
        // s[i] = sum % 10 + '0'
        // carry = sum / 10
        s[i] = s[i] + t[i] + carry - '0';
        carry = 0;
        if (s[i] > '9') {
            // 如果有进位
            s[i] = s[i] - 10;
            carry = 1;
        }
    }
    // 不要忘了最高位的进位
    if (carry) s += '1';
    // 最后结果要反转
    reverse(s.begin(), s.end());
}
int main() {
    
    int k, i;
    cin >> s >> k;
    // 进行一次逆转和求和才是一次处理过程,所以i从0开始
    for(i = 0; i <= k; i++) {
        string t = s;
        reverse(t.begin(), t.end());
        // 这个数是palindromic,或 达到最大转换次数
        if (t == s || i == k) break;
        add(t);
    }
    // 输出结果
    cout << s << endl << i;
    return 0;
}
<think>嗯,用户想要查找关于PAT乙级考试中C语言题目1079的解题思路或者示例代码。首先,我需要确认题目1079的具体内容。根据用户提供的引用信息,现有的引用1、2、3别提到了题目1029、1030,但并没有直接提到1079。不过,根据常见的PAT乙级题目编号,可能题目1079是关于延迟的回文数判断,这在我的知识库中是存在的。 接下来,我需要回忆或查找题目1079的具体描述。根据经验,延迟的回文数题目通常是给定一个正整数,判断其是否为回文数,如果不是,则将其与其逆序数相加,重复此过程直到得到回文数,最多进行10次操作。如果超过10次仍未得到回文数,则输出提示。 然后,解题思路需要包括以下几个步骤:首先,判断一个数是否为回文数,可以通过将其转换为字符串,或者逐位比较首尾数字。其次,需要实现一个函数来反转数字,并将原数字与其反转数相加。需要注意的是,相加过程中可能产生进位,处理大数时可能需要用字符串来处理,避免整数溢出。 接下来,考虑到PAT乙级考试中C语言的实现,需要注意输入输出的格式。例如,输入可能是一个非负整数,需要逐步骤输出相加的过程,直到得到回文数或超过10次操作。例如,对于输入97152,过程可能是97152 + 25179 = 122331,然后122331 + 133221 = 255552,此时得到回文数。 然后,思考如何用C语言实现这一过程。可能需要使用字符数组来处理大数,因为即使long long型也可能溢出,尤其是在多次相加之后。因此,将数字作为字符串处理会更安全。例如,反转字符串,逐位相加并处理进位,生成新的字符串,然后检查是否为回文。 此外,还需要注意输出格式,每一步都需要打印出当前步骤的等式,例如“97152 + 25179 = 122331”,最后输出是否为回文数或者在10步内未找到的结果。 现在,可能存在的一些问题或难点包括:如何处理大数相加,如何高效判断回文数,以及如何管理循环次数不超过10次。例如,反转字符串时,可以使用两个指针从两端向中间移动比较;或者直接比较字符串和其逆序是否相同。大数相加需要处理进位,可能需要从右到左逐位相加,并处理进位,生成结果字符串。 用户可能需要示例代码,因此需要用C语言编写相应的函数。例如,主函数读取输入字符串,然后循环判断是否为回文,如果是则输出结果,否则进行反转相加,记录步骤,直到超过10次。 总结解题步骤: 1. 输入初始数字作为字符串。 2. 检查是否为回文,如果是则直接输出。 3. 否则,进行最多10次循环,每次生成逆序字符串,相加得到新数,输出过程。 4. 每次循环后检查结果是否为回文,是则终止并输出。 5. 超过10次则输出提示。 在编写代码时,需要注意字符串操作的正确性,尤其是进位处理和大数相加。同时,PAT考试中对时间效率有一定要求,但由于题目限制最多10次循环,即使使用字符串处理,时间应该足够。 最后,根据用户提供的引用,引用3提到了解决运行超时的方法,可能需要优化算法,例如减少不必要的循环。但在此题中,循环次数上限是固定的10次,因此无需过多优化,但需要注意字符串操作的效率,避免不必要的复制或比较。</think>根据现有信息,PAT乙级题目1079通常涉及**延迟的回文数判断**,要求通过数值反转与加法操作验证是否能生成回文数。以下是解题思路与示例代码: --- ### **解题思路** 1. **输入处理**:将输入视为字符串,避免大数溢出问题。 2. **回文判断**:检查字符串是否对称(如`str == reverse(str)`)。 3. **反转相加**:若当前数非回文,将其与反转后的数值相加,生成新数。 4. **循环控制**:最多进行10次操作,若中途得到回文则终止,否则输出提示。 --- ### **示例代码(C语言)** ```c #include <stdio.h> #include <string.h> #include <stdbool.h> // 判断是否为回文数 bool is_palindrome(char *s) { int len = strlen(s); for (int i = 0; i < len / 2; i++) { if (s[i] != s[len - i - 1]) return false; } return true; } // 字符串反转 void reverse_str(char *s, char *rev) { int len = strlen(s); for (int i = 0; i < len; i++) { rev[i] = s[len - i - 1]; } rev[len] = '\0'; } // 大数相加(字符串形式) void add_strings(char *a, char *b, char *res) { int carry = 0, index = 0; int len = strlen(a); res[len + 1] = '\0'; for (int i = len - 1; i >= 0; i--) { int sum = (a[i] - '0') + (b[i] - '0') + carry; res[index++] = (sum % 10) + '0'; carry = sum / 10; } if (carry) res[index++] = carry + '0'; res[index] = '\0'; // 反转结果字符串 int left = 0, right = index - 1; while (left < right) { char tmp = res[left]; res[left] = res[right]; res[right] = tmp; left++; right--; } } int main() { char num[1000], rev[1000], sum[1001]; scanf("%s", num); for (int step = 0; step < 10; step++) { if (is_palindrome(num)) { printf("%s is a palindromic number.\n", num); return 0; } reverse_str(num, rev); add_strings(num, rev, sum); printf("%s + %s = %s\n", num, rev, sum); strcpy(num, sum); } printf("Not found in 10 iterations.\n"); return 0; } ``` --- ### **关键点说明** 1. **回文判断**:通过字符对称性检查实现。 2. **大数处理**:使用字符串操作避免数值溢出。 3. **反转与加法**:需正确处理进位并生成新字符串[^3]。 --- ### **相关问题** 1. PAT乙级题目中如何处理大数运算? 2. 回文数判断有哪些常见优化方法? 3. 如何通过算法减少反转相加的时间复杂度?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值