首页 > 试题广场 >

Palindromic Number (25)

[编程题]Palindromic Number (25)
  • 热度指数:2329 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
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.

输入描述:
Each input file contains one test case. Each case consists of two positive numbers N and K, where N (<= 1010) is the initial numer and K (<= 100) is the maximum number of steps.  The numbers are separated by a space.


输出描述:
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 K instead.
示例1

输入

67 3

输出

484<br/>2
使用int和long会越界,所以必须使用BigInteger
package go.jacob.day1019;

import java.math.BigInteger;
import java.util.Scanner;

public class Demo2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        BigInteger n = sc.nextBigInteger();
        int k = sc.nextInt();
        int index = 0;
        //一定要先验证是否是回文序列
        if (isPalin(n)) {
            System.out.println(n);
            System.out.println(index);
            return;
        }
        while (index < k) {
            index++;
            n = getReverseAdd(n);
            if (isPalin(n)) {
                break;
            }
        }
        System.out.println(n);
        System.out.println(index);
        sc.close();
    }

    private static boolean isPalin(BigInteger n) {
        String s = n.toString();
        int left = 0, right = s.length() - 1;
        while (left < right) {
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }

    private static BigInteger getReverseAdd(BigInteger n) {
        StringBuilder sb = new StringBuilder(n + "");
        BigInteger reverse = new BigInteger(sb.reverse().toString());
        return n.add(reverse);
    }
}

编辑于 2017-10-19 12:40:22 回复(0)
更多回答
#include <iostream>
#include<sstream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int main() {
    char  s[10010]={"\0"},temp[10010]={"\0"};
    int m,i,j,k;
    scanf("%s%d",s,&m);
    strcpy(temp,s);
    for(k=1;k<=m;k++)
    {
        reverse(temp,temp+strlen(temp));
        int carry=0;
        for(i=0;i<strlen(s);i++)
        {
            int t=temp[i]+s[i]-'0'-'0'+carry;
            s[i]=t%10+'0';
            carry=t/10;//新的进位
        }
        if(carry==1)
            s[i++]=carry+'0';
        for(j=0;j<=i/2;j++)
            if(s[j]!=s[i-1-j])
              break;
        if(j>i/2)
           break;
         strcpy(temp,s);
    }
    reverse(s,s+strlen(s));
    printf("%s\n%d\n",s,k<=m?k:k-1);
    return 0;
}

发表于 2018-06-08 15:07:10 回复(1)

-
// 1024 Palindromic Number.cpp: 定义控制台应用程序的入口点。
//

#include

#include

#include

#include <algorithm>
using namespace std;
struct Number
{
vector<int> num;
void set(string s){
for(int i = s.size()-1; i>=0; i--) {
num.push_back(s[i] - '0');
}
}
void show() {
for (int i = num.size() - 1; i >= 0; i--) {
cout << num[i];
}
cout << endl;
}
friend Number operator+(const Number& a,const Number& b){
Number ret;
int add = 0;
int minsi***(a.num.size(), b.num.size());
int i = 0;
for (; i<minsize; i++) {
int temp = b.num[i] +a.num[i] + add;
ret.num.push_back(temp % 10);
add = temp / 10;
}
for (; i < a.num.size(); i++) {
int temp = b.num[i] + a.num[i] + add;
ret.num.push_back(temp % 10);
add = temp / 10;
}
for (; i < b.num.size(); i++) {
int temp = b.num[i] + a.num[i] + add;
ret.num.push_back(temp % 10);
add = temp / 10;
}
if (add != 0) {
ret.num.push_back(add);
}
return ret;
}
Number reverse() {
Number ret;
for (int i = num.size() - 1; i >= 0; i--) {
ret.num.push_back(num[i]);
}
return ret;
}
bool isPalindromic() {
for (int i = 0; i <num.size()/2; i++) {
if (num[i] != num[num.size() - i-1]) {
return false;
}
}
return true;
}
};


string num;
int Maxstep;
int main()
{
cin >> num >> Maxstep;
int i = 0;
Number n1,n2;
n1.set(num);
while (i<Maxstep&&!n1.isPalindromic())
{
n2 = n1.reverse();
n1 = n1 + n2;
i++;
/n1.show();
n2.show();
/
}
n1.show();
cout << i<<endl;
return 0;
}

​</int></algorithm>

编辑于 2019-01-06 17:34:52 回复(0)
c 没有java的biginteger真的麻烦!!要自己弄个数组,再进位。本代码牛客网pass,pat两个测试未过,有知道的麻烦说下

#include<stdio.h>

#include<iostream>

#include<string>

#include<math.h>

using namespace std;


bool ishuiwen(string number)

{

    if(number.size()==1)

        return true;

    int N = 0;

    if(number.size()%2==0)

    {

        N=number.size()/2;

    }else

    {

        N=number.size()/2-1;

    }

    for(int i=0;i<=N;i++)

    {

        if(number[i]!=number[number.size()-1-i])

        {

            return false;

        }

    }

    return true;

}

int main()

{

    

    string number;

    int maxstep;

    int current = 1;

    cin>>number;

    cin>>maxstep;

    

    while(1)

    {

        char bigdata[100]={'\0'};

        if(current>maxstep)

        {

            for(int i=number.size()-1;i>=0;i--)

                    cout<<number[i];

                cout<<endl<<maxstep<<endl;

            break;

        }

        bool jinwei = false;

        for(int i=0;i<number.size();i++)

        {

            int tmp =0 ;

            if(jinwei)

                tmp = number[i]+number[number.size()-1-i]+1-48-48;

            else

                tmp = number[i]+number[number.size()-1-i]-48-48;

            

            if(tmp>=10)

            {

                jinwei = true;

                if(i==number.size()-1)

                {

                    tmp = tmp%10;

                    bigdata[i] = tmp+48;

                    bigdata[i+1] = 1+48;

                    break;

                }

                tmp = tmp%10;

                

            }else

            {

                jinwei = false;

            }

            

            bigdata[i] = tmp+48;

        }

     

        number = bigdata;

        //cout<<number<<endl;

    

        //判断是否是回文

        //bool huiwen = false;

        if(ishuiwen(number))

        {

            cout<<number<<endl<<current<<endl;

            break;

        }

        current++;

    }

    //cout<<result<<"-"<<maxstep<<endl;


    return 0;

}


发表于 2018-03-01 16:58:05 回复(2)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct bign{                                 //大整数
    int d[1000],len;
    bign(){
        memset(d,0,sizeof(d));
        len=0;
    }
};
bign change(char s[]){                      //字符转大整数
    bign ans;
    ans.len=strlen(s);
    for(int i=0;i<ans.len;i++)
        ans.d[i]=s[ans.len-i-1]-'0';
    return ans;
}
bign add(bign a,bign b){                   //大整数加法运算
    bign ans;
    int carry=0;
    for(int i=0;i<a.len||i< b.len;i++){
        int temp=a.d[i]+b.d[i]+carry;
        ans.d[ans.len++]=temp%10;
        carry=temp/10;
    }
    if(carry!=0)
        ans.d[ans.len++]=carry;
    return ans;
}
bool judge(bign s){                      //判断是否为回文串
    for(int i=0;i<=s.len/2;i++){
        if(s.d[i]!=s.d[s.len-i-1])
            return false;
    }
    return true;
}
int main(){
    char s[1000];
    int j,k;
    cin>>s>>k;
    bign ans=change(s);
    for(j=0;j<k && !(judge(ans));j++){
        bign b=ans;
        reverse(b.d,b.d+b.len);           //先反转
        ans=add(ans,b);
    }
    for(int i=ans.len-1;i>=0;i--)        //从高位到地位输出
        cout<<ans.d[i];
    cout<<'\n'<<j;
    return 0;
}

发表于 2018-02-24 13:12:04 回复(0)
#include<bits/stdc++.h>
using namespace std;

struct bign {
	int d[1000];
	int len;
	bign() {
		memset(d,0,sizeof(d));
		len=0;
	}
};

bign change(string str) {
	bign a;
	a.len=str.size();
	for(int i=0; i<a.len; i++) {
		a.d[i]=str[a.len-1-i]-'0';
	}
	return a;
}

bign Add(bign a,bign b) {
	bign c;
	int carry=0;
	for(int i=0; i<a.len||i<b.len; i++) {
		int temp=a.d[i]+b.d[i]+carry;
		c.d[c.len++]=temp%10;
		carry=temp/10;
	}
	if(carry!=0) {
		c.d[c.len++]+=carry;
	}
	return c;
}

bool Judge(bign a){
	for(int i=0;i<a.len/2;i++){
		if(a.d[i]!=a.d[a.len-1-i]){
			return 0;
		}
	}
	return 1;
}

void Printf(bign a){
	for(int i=a.len-1;i>=0;i--){
		cout<<a.d[i];
	}
	cout<<endl;
}

int main() {
	string str1;
	int n,k=0;
	cin>>str1>>n;
	bign a=change(str1);
	while(k<n&&!Judge(a)){
		bign b=a;
		reverse(b.d,b.d+b.len);
		a=Add(a,b);
		k++;
	}
	Printf(a);
	cout<<k<<endl;
	return 0;
}

发表于 2022-11-16 22:52:28 回复(0)
短小又精悍!!!!
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string str,restr;
int k,cnt;
int main(){
	cin>>str>>k;
	do{
		restr=str;
		reverse(restr.begin(),restr.end());
		if(restr==str) break;
		int carry=0,temp1,temp2;
		for(int i=0;i<str.size();i++){
			temp1=str[i]-'0',temp2=restr[i]-'0';
			str[i]=(temp1+temp2+carry)%10+'0';
			carry=(temp1+temp2+carry)/10;
		}
		if(carry) str.push_back(carry+'0');
		reverse(str.begin(),str.end());
	}while(++cnt < k );
	cout<<str<<endl;
	printf("%d",cnt);
	return 0;
}

发表于 2021-01-29 11:45:19 回复(0)
最简单就是用Python来写了
def ok(a):
    a = str(a)
    b = a[::-1]
    if a == b:
        return True
    else:
        return False

N, K = input().split(' ')
N = int(N)
K = int(K)
for i in range(1,K+1):
    n = str(N);
    n = n[::-1]
    N = int(n) + N
    if ok(N):
        break
print(N)
print(i)




编辑于 2021-01-26 18:14:23 回复(0)
# -*- coding: utf-8 -*-
"""
Created on Tue Apr 28 22:24:54 2020

@author: Kaguya_787
"""
def rev(a):
    s=0
    while a>0:
        s=s*10
        s=s+a%10
        a=a//10
    return s


m,k=map(int,input().split())
cnt=0

while k>0:
    k=k-1
    if m==rev(m):
        break
    cnt=cnt+1
    m+=rev(m)
    if m==rev(m):
        break

print(m,end="\n")
print(cnt)



编辑于 2020-06-23 18:52:12 回复(0)

思路:把数输入vector数组,然后在进行反转,加法类似于上个题目的逐个位相加,加了之后在进行反转,然后判断

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;

vector<int> sum(vector<int> a, vector<int> b);
bool check(vector<int> num);
int main() {
    vector<int> num, tem; int step = 0;
    char ch;
    while ((ch = getchar()) != ' ')num.push_back(ch - '0');
    cin >> step;
    tem = num;
    reverse(num.begin(), num.end());
    int i = 0;
    while (i < step) {
        num = sum(num, tem);
        if (i == step)break;
        if (check(tem)) {
            break;
        }
        else {
            tem = num;
            reverse(num.begin(),num.end());
        }
        i++;
    }
    for (vector<int>::iterator it = tem.begin(); it != tem.end(); it++)cout << *it;
    if (i <= step)cout << endl << i << endl;
    else cout << endl << step << endl;
    system("pause");
    return 0;
}
bool check(vector<int> num) {//检查
    for (int i = 0, j = num.size() - 1; i < j; i++, j--) {
        if (num[i] != num[j])return false;
    }
    return true;
}
vector<int> sum(vector<int> a, vector<int> b) {
    vector<int> num;
    int carry = 0, tem;
    for (int i = 0; i < a.size(); i++) {
        tem = a[i] + b[i] + carry;
        num.push_back(tem % 10);
        carry = tem / 10;
    }
    while (carry != 0) {
        num.push_back(carry % 10);
        carry /= 10;
    }
    reverse(num.begin(), num.end());
    return num;
}
发表于 2019-10-07 16:42:54 回复(0)
package PAT;

import java.math.BigInteger;
import java.util.Scanner;

public class Palindromic_Number {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String n=sc.next();
		int step=sc.nextInt();
		boolean f=false;
		for(int i=0;i<step;i++) {	// System.out.println(i);		
			if(isPalindromic(n)) {
				System.out.println(n);
				System.out.println(i);
				f=true;
				break;
			}
			n=sum(n,reverse(n));
		}
		if(!f) {
			System.out.println(n);
			System.out.println(step);
		}
			
	}
	static boolean isPalindromic(String s) {
		
		int i=0,j=s.length()-1;
		while(i<j) {
			if(s.charAt(i)!=s.charAt(j))
				return false;
			i++;j--;
		}
		return true;
	}
	static String reverse(String n) {
		String s="";
		for(int i=n.length()-1;i>=0;i--)
			s=s+n.charAt(i);
	return s;
	}
	static String sum(String a,String b) {
		BigInteger aa=new BigInteger(a);
		BigInteger bb=new BigInteger(b);
		String re=aa.add(bb).toString();
	//	System.out.println("re="+re);
		return re;
		
	}
}

发表于 2019-08-18 10:00:57 回复(0)
pat两个测试点不过,原因是本身是回文数的121,应返回0次处理;
#include<iostream>
#include<cstdio>

using namespace std;

int main()
{     char num_str[13] = {0};     int number[120] = {0};      int step;     int pos = 100;          scanf("%s %d",&num_str,&step);          int bit = 0;     for(;bit < 13 && num_str[bit] != 0; bit++)         number[bit+pos] = num_str[bit] - '0';               int i = 0;               while(i < step){                 bool is_num = true;                  for(int j3 = 0;j3 < bit/2;j3++){             if(number[j3+pos] != number[bit+pos-j3-1]){                 is_num = false;                 break;                     }                  if(is_num)             break;         else             i++;                  for(int j1 = 0;j1 < bit/2;j1++){             int tmp = number[pos+j1];             number[j1+pos] += number[bit+pos-j1-1];             number[bit+pos-j1-1] += tmp;         }                  if(bit % 2 != 0)             number[pos+bit/2] *= 2;                  for(int j2 = bit+pos-1;j2 > pos;j2--){             if(number[j2]>9){                 number[j2-1] += 1;                 number[j2] %= 10;              }         }         if(number[pos] > 9){             number[pos-1] += 1;             number[pos] %= 10;             pos--;              bit++;         }     }          for(int j4 = pos;j4<bit+pos;j4++)         cout<<number[j4];     cout<<endl<<i<<endl;          return 0;
} 

发表于 2019-03-01 17:42:31 回复(1)
//大数都要用vector比较保险
//本题longlong也会溢出
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;

typedef long long LL;

bool isPalindromic(vector<int> n)
{
    int i,j;
    for(i=0,j=n.size()-1;i<j;i++,j--)
    {
        if(n[i]!=n[j])
            break;
    }
    if(i<j)
        return false;
    else 
        return true;
}

vector<int> reverse(vector<int> v)
{
    vector<int> v2;
    int i,j;
    for(int i=v.size()-1;i>=0;i--)
        v2.push_back(v[i]);
    return v2;
}

void add(vector<int> &v1,vector<int> v2)
{
    int carry = 0;
    vector<int> v;
    for(int i=v2.size()-1;i>=0;i--)
    {
        int t = v1[i] + v2[i] + carry;
        v.push_back(t%10);
        carry = t/10;
    }
    if(carry==1)
        v.push_back(carry);
    v1 = v;
    v1 = reverse(v1);
}

int main()
{
    LL n;
    int k;
    cin>>n>>k;
    int t = k;
    vector<int> nv;
    while(n)
    {
        nv.push_back(n%10);
        n /= 10;
    }
    while(k>0 && !isPalindromic(nv))
    {
        add(nv,reverse(nv));
        k--;
    }
    for(int i=0;i<nv.size();i++)
        cout<<nv[i];
    cout<<endl;
    cout<<t-k<<endl;
}


发表于 2019-02-13 21:35:44 回复(0)
#include <iostream>
#include <vector>
#include <string>
#include <cstring>
using namespace std;

//1024 Palindromic Number
//这题一定要用string来做
//用long long会报段错误

bool isPalindromic(string str) {
    //n<=10^10

    //需要特别处理一下0
    if (str == "0") { return true; }


    int len = str.size() - 1;//下标修正 
    int flag = 0;
    for (int i = 0; i <= len / 2; ++i) {
        if (str[i] != str[len - i]) flag = 1;
    }

    if (flag == 1)
        return false;
    else
        return true;

}

string stringAdd(string str1, string str2) {

    //保证str1的位数较大
    if (str1.size() < str2.size()) {
        std::swap(str1, str2);
    }

    int len1 = str1.size(), len2 = str2.size();
    int gap = len1 - len2;

    char *res = (char *)malloc(sizeof(char)*(len1 + 1));
    memset(res, 0, sizeof(char)*(len1 + 1));

    //加法运算
    for (int i = len1 - 1; i >= gap; --i) {
        res[i + 1] += str1[i] - '0' + str2[i - gap] - '0';
        res[i] += res[i + 1] / 10; //立即进位
        res[i + 1] %= 10; //进位结束
    }

    //还原为字符串
    str1.clear();
    for (int i = 0; i <= len1; ++i) {
        str1 += res[i] + '0';
    }
    free(res);

    //检测首位0
    if (str1[0] == '0') {
        //str1.erase(0, 1); 
        //经过测试erase没有substr快
        return str1.substr(1);
    }

    return str1;


}

string reverse(string str) {
    int len = str.size() - 1; //下标修正
    char c;
    for (int i = 0; i <= len / 2; ++i) {
        c = str[i];
        str[i] = str[len - i];
        str[len - i] = c;
    }

    return str;
}

int main() {
    int k, i;//k<=100
    string n, t;//n<=10^10
    cin >> n >> k;
    t = n;
    for (i = 0; i < k; ++i) {
        if (isPalindromic(t)) {
            cout << t << endl;
            cout << i;
            return 0;
        }

        t = stringAdd(t, reverse(t));
    }
    cout << t << endl;
    cout << i;
    return 0;
}
发表于 2019-01-28 16:10:52 回复(0)
def ise(a):
    t1,te = [],''
    for i in a:
        t1.append(i)
    t1.reverse()
    for i in t1:
        te+=i
    if te==a:
        return True
    else:
        return False
n,k = map(int,input().split())
num = int(k)
while k:
    n1,n2 = int(n),[]
    n = str(n)
    for i in n:
        n2.append(i)
    n2.reverse()
    ns = ''
    for i in n2:
        ns+=i
    ns = int(ns)
    n = ns+n1
    k-=1
    if ise(str(n)):
        break
print(n)
print(num-k)

发表于 2018-12-11 19:28:52 回复(0)
#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
#define ll long long
#include<vector>
using namespace std;
int isHuiWen(char v[]){
    int k=strlen(v)/2;
    for(int i=0;i<k;i++){
        if(v[i]!=v[strlen(v)-1-i]){
            return 0;
            break;
        }
    }
    return 1;
}
int main(int argc, char** argv) {
    char in[200];
    int step;
    scanf("%s%d",in,&step);
    int flag,cnt=0;
    char out[200];
    while(!isHuiWen(out)){
        int c=0;
        int t=strlen(in);
        int count=0;
        for(int i=t-1;i>=0;i--){
            int tmp=in[i]-'0'+in[t-1-i]-'0'+c;
            out[count++]=tmp%10+'0';
            c=tmp/10;
        }
        out[count]='\0';
        if(c==1){
            out[count++]=c+'0';
            out[count]='\0';
        }
        strcpy(in,out);
        cnt++;
        if(cnt==step) break;
    }
    for(int i=strlen(out)-1;i>=0;i--){
        printf("%c",out[i]);
        }
        printf("\n%d",cnt);
    return 0;
}
编辑于 2018-10-18 21:04:40 回复(0)


// 牛客网,PAT双AC  注意pat 1024 的检测点不通过 测试 Input 0 3 output 0 这种本身就满足条件的点
#include<iostream>
#include<fstream>
#include<string.h>
#define N 200
using namespace std;

void reverse(char a[N],char b[N])
{
int len=strlen(a);
for(int i=0;i<len;i++)
{
b[len-i-1]=a[i];
}
b[len]='\0';
}
void add(char a[N],char b[N],char c[N])
{
int len = max(strlen(a),strlen(b));
int cin=0;
fill(c,c+N,'\0');
for(int i=0;i<len;i++)
{

int numa,numb;
numa= len>strlen(a)?0:a[i]-'0';
numb= len>strlen(b)?0:b[i]-'0';
int sum=numa+numb+cin;
cin=sum/10;
c[i]='0'+sum%10;

}
if(cin!=0)
{
c[len]=cin+'0';
}

}
bool isPail(char c[N])
{
int len=strlen(c);
bool is=true;
for(int i=0;i<len/2;i++)
{
if(c[i]!=c[len-i-1])
{
is=false;
break;
}

}
return is;
}
int main()
{

cin.sync_with_stdio(false);
int k;
char a[N],b[N],c[N];
cin>>a>>k;
if(isPail(a))
{
cout<<a<<"\n"<<0;
return 0;
}
for(int i=0;i<k;i++)
{
reverse(a,b);
add(a,b,c);
if(isPail(c))
{
cout<<c<<"\n"<<i+1;
break;
}
if(i==k-1)
{
reverse(c,b);
cout<<b<<"\n"<<i+1;
}
strcpy(a,c);

}


return 0;
}
编辑于 2018-08-26 17:11:10 回复(0)
思路:比较简单但是我debug了比较久  _φ(❐_❐✧ 人丑就要多读书
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

bool CheckPalindromicNum(const string str)
{
    // 首先判断
    bool Palindromic = false;
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] != str[str.size() - 1 - i])
        {
            break;
        }
        if (i == str.size() - 1)
        {
            Palindromic = true;
        }
    }
    return Palindromic;
}

string PalindromicNum(const string str)
{
    // 如果不是回文数那么 回数相加
    string out;
    int carry = 0;
    for (int i = 0; i < str.size(); i++)
    {
        if (str[i] + str[str.size() - 1 - i] - '0' + carry <= '9')
        {
            char tmp = str[i] + str[str.size() - 1 - i] - '0' + carry;
            out = tmp + out;
            carry = 0;
        }
        else
        {
            char tmp = str[i] + str[str.size() - 1 - i] - '0' + carry - 10;
            out = tmp + out;
            carry = 1;
        }    
    }
    if (carry == 1)
    {
        out = '1' + out;
    }
    return out;
}


int main()
{
    long long k;
    string n;
    while (cin >> n >> k)
    {
        for (int i = 0; i <= k; )
        {
            if (CheckPalindromicNum(n) || i == k )
            {
                cout << n << endl;
                cout << i << endl;
                break;
            }
            else
            {
                n = PalindromicNum(n);
                i++;
            }
        }
    }
}

发表于 2018-08-21 22:00:46 回复(0)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string conversr(string n)
{
string s=n;
reverse(s.begin(),s.end());
return s;
}
string add(string A,string B)
{
string result="";
int pre=0;
char ch;
for(int i=A.size()-1;i>=0;i--)
{
int a=A[i]-'0';
int b=B[i]-'0';
int val=a+b+pre;
pre=val/10;
ch='0'+val%10;
result=ch+result;
}
ch=pre+'0';
if(pre!=0)result=ch+result;
return result;
}
int main()
{
string n;
int step;
cin>>n>>step;
int i=0;
for(;i<step;i++)
{
string travel=conversr(n);
if(n==travel)break;
n=add(n,travel);
}
cout<<n<<endl;;
cout<<i;
return 0;
}

发表于 2017-09-07 00:17:15 回复(0)

问题信息

难度:
28条回答 5034浏览

热门推荐

通过挑战的用户