PAT 甲级 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 分)(大数加法,考虑这个数一开始是不是回文串)的更多相关文章
- PAT 甲级 1024 Palindromic Number
1024. Palindromic Number (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A ...
- 【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 ...
- 1024 Palindromic Number (25 分)
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
- 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 ...
- 【PAT甲级】1024 Palindromic Number (25 分)
题意: 输入两个正整数N和K(N<=1e10,k<=100),求K次内N和N的反置相加能否得到一个回文数,输出这个数和最小的操作次数. trick: 1e10的数字相加100次可能达到1e ...
- 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 ...
- PAT 甲级 1020 Tree Traversals (25分)(后序中序链表建树,求层序)***重点复习
1020 Tree Traversals (25分) Suppose that all the keys in a binary tree are distinct positive intege ...
- PAT 甲级 1146 Topological Order (25 分)(拓扑较简单,保存入度数和出度的节点即可)
1146 Topological Order (25 分) This is a problem given in the Graduate Entrance Exam in 2018: Which ...
- PAT 甲级 1071 Speech Patterns (25 分)(map)
1071 Speech Patterns (25 分) People often have a preference among synonyms of the same word. For ex ...
随机推荐
- Vue 一些用法
v-model : 数据绑定(多数用于表单元素) ps:同时v-model支持双向数据绑定v-for : 用于元素遍历v-on:事件名称=“方法名” (事件绑定)ps: methods:用于绑定 v- ...
- Python中的对象与参考
参考 当创建一个对象并给它赋一个变量的时候,这个变量仅仅参考哪个对象,而不是表示这个对象本身!也就是说,变量名指向你计算机中存储那个对象的内存.这被称作名称到对象的绑定. 对象与参考的例子 注意两次不 ...
- idou老师教你学Istio 18 : 如何用istio实现应用的灰度发布
Istio为用户提供基于微服务的流量治理能力.Istio允许用户按照标准制定一套流量分发规则,并且无侵入的下发到实例中,平滑稳定的实现灰度发布功能. 基于华为云的Istio服务网格技术,使得灰度发布全 ...
- HTTP的原理和工作机制
HTTP到底是什么? 两种最直观的印象:①.浏览器地址栏输入地址,打开网页:②.Android中发送网络请求,返回对应的内容: HyperText Transfer Protocal 超文本传输协议. ...
- java线程基础巩固---多线程死锁分析,案例介绍
之前已经学习了关于同步锁的知识,但是在实际编写多线程程序时可能会存在死锁的情况,所以这次来模拟一下死锁,并且学会用一个命令来确认是否程序已经出现死锁了,下面开始: 首先新建两个类: 此时当然得到Oth ...
- linux加载字体
将解压后的文件夹cp到/usr/share/fonts目录下,然后cd到/usr/share/fonts/ziti目录下执行:mkfontscalemkfontdirfc-cache 在linux,把 ...
- android-studio打包APK出现有关apk图标问题
报的错很多,有build gradle中的两个大红感叹号,由此引发了一大堆问题 注意到最后出现红色打包错误的代码: Failed to read PNG signature: file does no ...
- 关于b站爬虫的尝试(二)
前几天学习了scrapy的框架结构和基本的使用方法,部分内容转载自:http://blog.csdn.net/qq_30242609/article/details/52810840 scrapy由编 ...
- POJ-3186-Treats for the Cows(记忆化搜索)
链接: https://vjudge.net/problem/POJ-3186 题意: FJ has purchased N (1 <= N <= 2000) yummy treats f ...
- [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...