【PAT 甲级】1024 Palindromic Number (25)(25 分)(回文数,大数加法)

本文介绍了一个算法问题,即如何通过给定的正整数N及其最大步骤数K,在不超过K步的情况下找到与N配对的回文数及所需的步数。文章提供了完整的代码实现,并解释了如何使用字符串操作和大数加法来解决这个问题。

摘要生成于 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
题意:给定两个正整数n,k(n<=10^10,k<=100),若在k步内能否由n和本身反向相加得到一个回文数,则输出该回文数和步数,否则输出第k步得到的数和k.
思路:首先n的范围说明要用字符串,这里用string,方便回文数判断,剩下的就是大数和了。

代码:

#include <iostream>
#include <sstream>
#include <string>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e3+5;
const ll INF = 0x3f3f3f3f;
const double eps=1e-4;
const int T=3;

string str;
int k;
string add(string a,string b) {
    char ans[N]= {0};
    ans[N-1]='\0';
    int len=N-2;
    for(int i=a.length()-1; i>=0; i--,len--) {
        int tmp=ans[len]+a[i]-'0'+b[i]-'0';
        if(tmp>9) {
            ans[len]=tmp%10+'0';
            ans[len-1]++;
        } else {
            ans[len]=tmp+'0';
        }
    }
    if(ans[len]>0) {
        ans[len]+='0';
        len--;
    }
    return string(ans+len+1);
}
int main() {
    cin>>str>>k;
    bool flag=0;
    for(int i=0; i<k; i++) {
        string s=str;
        reverse(s.begin(),s.end());
        if(s!=str) {
            str=add(str,s);
        } else {
            flag=1;
            cout<<str<<"\n"<<i<<endl;
            break;
        }
    }
    if(!flag) {
        cout<<str<<"\n"<<k<<endl;
    }
    return 0;
}

### 双重回文数算法实现 双重回文数是指一个数不仅本身是一个回文数,而且它的二进制表示也是一个回文数。以下是基于 C 语言的解决方案以及一些扩展说明。 #### 判断整数是否为十进制回文数 可以通过将数字逐位提取并反转来验证其是否为回文数。具体做法如下: ```c #include <stdio.h> int isPalindromeDecimal(int num) { int originalNum = num; int reversedNum = 0; while (num > 0) { reversedNum = reversedNum * 10 + num % 10; num /= 10; } return originalNum == reversedNum ? 1 : 0; // 返回布尔值[^1] } ``` 上述代码实现了对给定整数 `originalNum` 的逆序计算,并将其与原数值对比以确认是否为回文数。 --- #### 将整数转换为其对应的二进制形式 为了进一步判断该数的二进制表达是否也是回文数,可以先完成从十进制到二进制字符串的转换操作。 ```c void decimalToBinaryString(int num, char binaryStr[]) { int index = 0; do { binaryStr[index++] = '0' + (num & 1); num >>= 1; } while (num); binaryStr[index] = '\0'; } int isPalindromeBinary(char str[]) { int length = strlen(str); for (int i = 0; i < length / 2; ++i) { if (str[i] != str[length - i - 1]) { return 0; } } return 1; } ``` 这里定义了一个辅助函数用于生成目标整数的二进制串,并提供另一个逻辑检测器用来评估这个新产生的序列是否满足镜像特性。 --- #### 组合功能形成最终判定流程 综合以上两个部的功能模块,可构建完整的程序框架如下所示: ```c #include <stdio.h> #include <string.h> #define MAX_BINARY_LEN 32 int isPalindromeDecimal(int num); // 声明前面已有的方法 void decimalToBinaryString(int num, char binaryStr[]); int isPalindromeBinary(char str[]); int main() { int number; printf("Enter an integer: "); scanf("%d", &number); if (isPalindromeDecimal(number)) { char binary[MAX_BINARY_LEN]; decimalToBinaryString(number, binary); // Reverse the string since it was built backwards. int len = strlen(binary); for (int i = 0; i < len / 2; ++i) { char temp = binary[i]; binary[i] = binary[len - i - 1]; binary[len - i - 1] = temp; } if (isPalindromeBinary(binary)) { printf("%d is a dual palindrome.\n", number); } else { printf("%d is not a dual palindrome because its binary form (%s) isn't palindromic.\n", number, binary); } } else { printf("%d is not even a single palindrome in base-10.\n", number); } return 0; } ``` 此版本包含了输入处理、调用先前开发好的组件执行必要的检查工作流,最后输出相应的结论信息。 --- #### 关于环形数组的应用思考 虽然当前讨论的主题集中在如何识别双重回文性质上,但如果涉及更复杂的场景比如需要考虑循环结构下的数据访问模式,则可能会引入类似于引用中的技术手段——即通过复制整个列表至自身末端位置处创建虚拟闭环效果以便简化边界条件管理过程[^2]。 然而,在解决此类特定竞赛类问题时应当注意效率优化方面的要求;尽管如此简单的重复存储策略易于理解且便于编码实践,但在大规模数据集面前仍可能存在性能瓶颈风险因此需谨慎选用实际应用场景下更为高效合理的替代方案如利用模运算动态索引定位等方式代替显式的额外空间配动作减少不必要的内存消耗提升整体运行速度表现水平。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值