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

题意:

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

trick:

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

AAAAAccepted code

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 char num[107];
 5 char s[107];//这里用string的时候会遇到以下的小问题,查阅资料后发现直接对string原有长度以后的位置赋值不能增加它的长度,建议采用s+=" xxx",的形式可以增加string的长度。
 6 int k;
 7 int main(){
 8     cin>>s>>k;
 9     int tot=k;
10     int flag=0;
11     int siz=strlen(s);
12     while(k--){
13         memset(num,0,sizeof(num));
14         int cnt=0;
15         for(int i=siz-1;i>=0;--i)
16             num[++cnt]=s[i];
17         flag=0;
18         for(int i=1;i<=cnt/2;++i)
19             if(num[i]!=num[cnt-i+1]){
20                 flag=1;
21                 break;
22             }
23         if(!flag){
24             flag=2;
25             break;
26         }
27         string y;
28         int jinwei=0;
29         for(int i=cnt;i;--i){
30             int tt=num[i]+s[i-1]-'0'-'0'+jinwei;
31             y[i]=tt%10+'0';
32             jinwei=tt/10;
33         }
34         if(jinwei)
35             y[0]='1';
36         if(y[0]!=0)
37             for(int i=0;i<=cnt;++i)
38                 s[i]=y[i];
39         else
40             for(int i=1;i<=cnt;++i)
41                 s[i-1]=y[i];
42         if(s[cnt]!=0)
43             siz=cnt+1;//这里用siz来更新s的长度会在使用string s的时候出现段错误
44         else
45             siz=cnt;//这里如果不用siz来更新s的长度会在使用string s的时候s.size()不更新,依然是输入s的时候的size(),不是很懂,在size()-1以后的位置给s赋值,不能更新它的size(),用siz更新也会出现段错误
46     }
47     for(int i=0;i<siz;++i)
48         cout<<s[i];
49     cout<<endl;
50     if(flag==2)
51         cout<<tot-k-1;
52     else
53         cout<<tot;
54     return 0;
55 }

 

 

 

posted @ 2019-09-01 17:37  sewage  阅读(197)  评论(0编辑  收藏  举报