PAT甲级1024 Palindromic Number (25 分)

Posted ldudxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT甲级1024 Palindromic Number (25 分)相关的知识,希望对你有一定的参考价值。

题意:

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

trick:

1e10的数字相加100次可能达到1e40,所以long long会爆,采用字符数组操作,以及代码注释中遇到的一些小问题。

代码:

#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
char num[107];
char s[107];//这里用string的时候会遇到以下的小问题,查阅资料后发现直接对string原有长度以后的位置赋值不能增加它的长度,建议采用s+=" xxx",的形式可以增加string的长度。
int k;
int main()
cin>>s>>k;
int tot=k;
int flag=0;
int siz=strlen(s);
while(k--)
memset(num,0,sizeof(num));
int cnt=0;
for(int i=siz-1;i>=0;--i)
num[++cnt]=s[i];
flag=0;
for(int i=1;i<=cnt/2;++i)
if(num[i]!=num[cnt-i+1])
flag=1;
break;

if(!flag)
flag=2;
break;

string y;
int jinwei=0;
for(int i=cnt;i;--i)
int tt=num[i]+s[i-1]-‘0‘-‘0‘+jinwei;
y[i]=tt%10+‘0‘;
jinwei=tt/10;

if(jinwei)
y[0]=‘1‘;
if(y[0]!=0)
for(int i=0;i<=cnt;++i)
s[i]=y[i];
else
for(int i=1;i<=cnt;++i)
s[i-1]=y[i];
if(s[cnt]!=0)
siz=cnt+1;//这里用siz来更新s的长度会在使用string s的时候出现段错误
else
siz=cnt;//这里如果不用siz来更新s的长度会在使用string s的时候s.size()不更新,依然是输入s的时候的size(),不是很懂,在size()-1以后的位置给s赋值,不能更新它的size(),用siz更新也会出现段错误

for(int i=0;i<siz;++i)
cout<<s[i];
cout<<endl;
if(flag==2)
cout<<tot-k-1;
else
cout<<tot;
return 0;

以上是关于PAT甲级1024 Palindromic Number (25 分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT 甲级 1019 General Palindromic Number

PAT甲级——A1019 General Palindromic Number

PAT 甲级 1019 General Palindromic Number (进制转换,vector运用,一开始2个测试点没过)

PAT 1024 Palindromic Number

PAT 1024. Palindromic Number

PAT Advanced 1024 Palindromic Number (25分)