1024 Palindromic Number (25 分)
 

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 (≤) is the initial numer and K (≤) 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 Kinstead.

Sample Input 1:

67 3

Sample Output 1:

484
2

Sample Input 2:

69 3

Sample Output 2:

1353
3

题解:

  一开始便直接考虑用大数加法以防万一。第一次提交发现测试点2和测试点3没过,自己分析出了原因,可能在不加之前就已经是回文串,即k=0,还有单个数字也是回文串。



  本题考查的是数的相加和逆序,本属于简单题,但是本质考查了大数相加的知识。未注意到大数相加会导致测试点6和测试点8(从0开始)未通过。理由是本题的N的范围是(0,1010],k的范围是(0,100],我们考虑最坏的情况,假设N是一个非常逼近1010的值并且进行了100步操作依然未得到回文值,则简单推测可知计算过程中遇到的最大值是2100*1010,这个值超出了long long int(263-1,约9.2*1018)表示范围,因此需要用char存储数的值。

AC代码:

#include<bits/stdc++.h>
using namespace std;
char a[];
char b[];
char c[];
int n;
int main(){
cin>>a;
cin>>n;
int l=strlen(a);
for(int i=;i<l;i++){
b[i]=a[l-i-];
}
//先检查第0代它本身是不是回文
int f=;
int mid=(l-)/;
for(int j=;j<=mid;j++){
if(a[j]!=a[l-j-]){
f=;
break;
}
}
if(f){
cout<<a<<endl;
cout<<;
}
else{//再考虑第1代及以后
int k=-;
for(int i=;i<=n;i++){
//加起来得到一个新的值
int x=;
for(int j=;j<l;j++){
x=a[j]-''+b[j]-''+x;
c[j]=x%+'';
x=x/;
}
if(x>){
c[l++]=x+'';
}
//检查符不符合要求
mid=(l-)/;
f=;
for(int j=;j<=mid;j++){
if(c[j]!=c[l-j-]){
f=;
break;
}
}
if(f){//是回文
k=i;
break;
}
for(int j=;j<l;j++){//更新
a[j]=c[j];
b[j]=c[l-j-];
}
}
for(int i=l-;i>=;i--){//输出结果
cout<<c[i];
}
cout<<endl;
if(k!=-){//还没到n代
cout<<k<<endl;
}else{
cout<<n<<endl;
}
}
return ;
}

学一下别人简洁得代码:

#include <iostream>
#include <algorithm>
using namespace std;
string add(string a){
string ans=a;
reverse(a.begin(),a.end());
int i=a.length()-,add=;
while(i>=){
int tmp=a[i]-''+ans[i]-'';
ans[i]=(add+tmp)%+'';
add=(tmp+add)/;
i--;
}
if(add) ans.insert(,"");
return ans;
}
int main(){
string s;
int k;
cin>>s>>k;
string tmp=s;
reverse(tmp.begin(),tmp.end());
if(tmp==s) cout<<tmp<<endl<<;
else{
int i=;
while(i<k){
s=add(tmp);
i++;
tmp=s;
reverse(tmp.begin(),tmp.end());
if(tmp==s) break;
}
cout<<s<<endl<<i;
}
return ;
}

PAT 甲级 1024 Palindromic Number (25 分)(大数加法,考虑这个数一开始是不是回文串)的更多相关文章

  1. PAT 甲级 1024 Palindromic Number

    1024. Palindromic Number (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...

  2. 【PAT】1024. Palindromic Number (25)

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  3. 1024 Palindromic Number (25 分)

    A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

  4. PAT Advanced 1024 Palindromic Number (25) [数学问题-⼤整数相加]

    题目 A number that will be the same when it is written forwards or backwards is known as a Palindromic ...

  5. 【PAT甲级】1024 Palindromic Number (25 分)

    题意: 输入两个正整数N和K(N<=1e10,k<=100),求K次内N和N的反置相加能否得到一个回文数,输出这个数和最小的操作次数. trick: 1e10的数字相加100次可能达到1e ...

  6. 1024 Palindromic Number (25)(25 point(s))

    problem A number that will be the same when it is written forwards or backwards is known as a Palind ...

  7. PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习

    1020 Tree Traversals (25分)   Suppose that all the keys in a binary tree are distinct positive intege ...

  8. PAT 甲级 1146 Topological Order (25 分)(拓扑较简单,保存入度数和出度的节点即可)

    1146 Topological Order (25 分)   This is a problem given in the Graduate Entrance Exam in 2018: Which ...

  9. PAT 甲级 1071 Speech Patterns (25 分)(map)

    1071 Speech Patterns (25 分)   People often have a preference among synonyms of the same word. For ex ...

随机推荐

  1. vue-cli3 将自己写的组件封装成可引入的js文件

    一.调整项目结构 首先用 vue-cli 创建一个 default 项目 // 顺便安利一篇文章<Vue 爬坑之路(十二)—— vue-cli 3.x 搭建项目> 当前的项目目录是这样的: ...

  2. 「Django」Xadmin应用

    第一:命令安装xadmin2 pip install xadmin2 第二:setting.py中设置 INSTALLED_APPS INSTALLED_APPS = ( ... 'xadmin', ...

  3. Java8-Concurrency

    import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; public class Concurrency1 { pu ...

  4. 2019HDU多校第六场1009 Three Investigators——杨表

    题意 给定一个 n 个元素的数列,从前 k 个元素中取5次不下降子序列,求取得的和的最大值(k从1至n) 分析 考虑将数字 a[i] 拆成 a[i] 个 a[i],比如 “4,1,2”→“4,4,4, ...

  5. AtCoder Beginner Contest 148

    ABC 148 第一次打abc,记录一下 Task Name Time Limit Memory Limit A Round One 2 sec 1024 MB B Strings with the ...

  6. 生日礼物 HYSBZ - 1293 【单调队列】【求最短区间的长度,区间需要满足包含所有颜色种类】

    生日礼物 小西有一条很长的彩带,彩带上挂着各式各样的彩珠.已知彩珠有N个,分为K种.简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置).某些坐标上可以没有彩珠,但多个彩珠也可以出现在 ...

  7. JSON格式数据

    1. 基础知识 1. 什么是JSON格式? JSON格式是现在网站数据交互的标准数据格式,写入标准. 取代原来的XML:符合JS原生语法,可以被直接解析,不需要额外的解析文件. 书写简单,一目了然 2 ...

  8. this绑定问题

    this是属性和方法“当前”(运行时)所在的对象.this是函数调用时发生的绑定,它的值只取决于调用位置(箭头函数除外). 函数调用的时候会产生一个执行上下文,this是对这个执行上下文的记录. ❌误 ...

  9. 在C语言中破坏函数调用堆栈

    // 这段代码显示,在C语言修改函数的返回地址 int test1() { ; } int test2(int a) { *(&a-) = (int)test1; // 将返回地址修改为tes ...

  10. 解决zabbix的cannot allocate shared memory of size错误

    问题状态:zabbix_server 不能启动,系统CentOS 6.7 原因分析:这是因为内核对share memory的限制造成的. 用到如下命令ipcs [-m|l|a],sysctl [-a| ...