当前位置: 代码迷 >> 综合 >> PTA1024 Palindromic Number (字符串逆置,大数,回文串)
  详细解决方案

PTA1024 Palindromic Number (字符串逆置,大数,回文串)

热度:67   发布时间:2023-11-08 14:37:56.0

分析:写错了,问题出在100次相加,开始认为10的10次方没有问题,实际上累加100次最大数,longlong是不够的,要用大数进行操作(字符串加法)。

注意字符串逆置的问题:

#include <iostream>
#include <string>
using namespace std;int main()
{
    string s,s1;cin>>s;s1 = s;         //这里一定要有s1=s,如果没有这句话就无法正确的打印。int len=s.length();//reversefor(int i=0;i<len;i++){
    s1[len-i-1]=s[i];}cout<<s<<endl;cout<<s1<<endl;return 0;
}

(1)学习一下怎么对string字符串进行操作的,直接s+=“abcd”即可。
(2)学习一下字符串翻转函数reverse()
AC:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int k,sum=0,ans=0,cnt=0;
bool judge(string s){
    ll len=s.length();for(ll i=0;i<len;i++){
    if(s[i]!=s[len-1-i]) return false;}return true;
}
string adds(string ss1,string ss2){
    int len=ss1.length(),jinwei=0;for(int i=len-1;i>=0;i--){
    int x=ss1[i]-'0'+ss2[i]-'0';if(jinwei){
    x++;jinwei=0;}if(x>9){
    jinwei=1;}ss1[i]=x%10+'0';}string sss;if(jinwei==1){
    sss="1";sss+=ss1;ss1=sss;}return ss1;
}int main(){
    string s1;cin>>s1>>k;while(cnt<k&&!judge(s1)){
    cnt++;string s2=s1;reverse(s2.begin(),s2.end());s1=adds(s1,s2);}cout<<s1<<endl;cout<<cnt<<endl;return 0;
}

WA

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll k,sum=0,ans=0,cnt=0;
bool judge(string s){
    ll len=s.length();for(ll i=0;i<len;i++){
    if(s[i]!=s[len-1-i]) return false;}return true;
}
string adds(string ss1,string ss2){
    string ss;int len=ss1.length();int jinwei=0;for(int i=len-1;i>=0;i++){
    int tmp=ss1[i]-'0'+ss2[i]-'0';if(jinwei){
    tmp++;jinwei=0;}if(tmp>9){
    jinwei=1;}ss[i]=tmp%10+'0';}string sss;if(jinwei=1){
    sss="1";sss+=ss;ss=sss;}return ss;
}
int main(){
    string s1;cin>>s1>>k;while(cnt<k&&!judge(s1)){
    cnt++;string s2=s1;reverse(s2.begin(),s2.end());s1=adds(s1,s2);}cout<<s1<<endl;cout<<cnt<<endl;return 0;
}

WA。。。。。。。。。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string s;
ll k,sum=0,ans=0,cnt=0;
bool flag=false;
int main(){
    cin>>s>>k;while(cnt<k){
    cnt++;ll len=s.length();ll tmp=0;for(ll i=0;i<len;i++){
    tmp=(tmp+s[i]-'0'+s[len-i-1]-'0')*10;}tmp=tmp/10;//判断是否是回文//int len1=getlen(tmp);s="";vector<ll> vv;vv.clear();while(tmp){
    vv.push_back(tmp%10);tmp=tmp/10;}ll len1=vv.size();for(ll i=0;i<len1;i++){
    s+=(vv[len1-i-1]+'0');          //学习一下字符串如何逆置}//cout<<s<<endl;ll len2=s.length();ll cc=0;for(ll i=0;i<len2;i++){
    if(s[i]==s[len2-i-1]){
    cc++;}}if(cc==len2) {
    flag=true;break;}}cout<<s<<endl;cout<<cnt<<endl;return 0;
}
  相关解决方案