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.
67 3
484<br/>2
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); } }
#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; }
-
// 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>
#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;
}
#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; }
#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; }
#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; }
# -*- 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)
思路:把数输入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; }
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; } }
#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; }
//大数都要用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; }
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)
#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;
}
思路:比较简单但是我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++; } } } }
}