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. SVN将项目代码加入svn版本控制

    将已有项目代码加入svn版本控制 - TortoiseSVN入门篇Windows下SVN实用教程(以TortoiseSVN作为客户端(client)) 翻译: Bravo Young Next: 版本 ...

  2. k2系列-服务器管理篇

    k2服务器即K2 WORKSPACE管理介绍: k2 管理平台统一管理基于K2开发的所有流程的跟踪调试以及基本配置信息. 具体完成的操作有以下几个部分: 1 配置K2环境相关属性.包括全局变量等 2 ...

  3. 网络分类及OSI七层模型

    一.网络分类: 局域网(LAN)是指在某一区域内由多台计算机互联成的计算机组.一般是方圆几千米以内.局域网可以实现文件管理.应用软件共享.打印机共享.工作组内的日程安排.电子邮件和传真通信服务等功能. ...

  4. inux中查看各文件夹大小命令:du -h --max-depth=1

    du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=<目录或文件>] [--max-de ...

  5. python3 Pandas

    一.Pandas 1.Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,主要用于数据处理(数据整理,操作,存储,读取等) 2.http://pa ...

  6. Autodesk Maya 2019 安装

    为什么我接触到建模了呢,我也不知道.只会弄点桌椅板凳简单动画,希望有时间更进一步学习,毕竟我还有一个开发游戏的梦想. 步骤:下载-安装-激活 Maya吧各版本合集下载 地址:https://pan.b ...

  7. java判断文件是否为图片

    /** * 判断文件是否为图片<br> * <br> * @param pInput 文件名<br> * @param pImgeFlag 判断具体文件类型< ...

  8. 后缀自动机求endpos集大小

    #include<bits/stdc++.h> #define fi first #define se second #define INF 0x3f3f3f3f #define LNF ...

  9. 15-Node.js学习笔记-Express的安装及检验

    最新的node已经把一些命令工具单独的分出来了,所以我们应该先下安装他的打包函数,再安装express,在进行检验就安装成功了 如需require还需在文件夹内单独安装 sudo npm instal ...

  10. sublime text 3 3126注册码

    —– BEGIN LICENSE —– Michael Barnes Single User License EA7E-821385 8A353C41 872A0D5C DF9B2950 AFF6F6 ...