知识点
疑问
暂无
代码
#include "bits/stdc++.h"
using namespace std;
const int maxn = 100000;
struct bign{
int d[maxn];
int len;
bign(){
fill(d,d+maxn,0);
len=0;
}
};
//最大的次数
int k;
//输入的数组
char str[maxn];
bign change(char str[]){
bign c;
int l = strlen(str);
for(int i=0;i<l;i++){
c.d[i] = str[l-1-i] - '0';
c.len++;
}
return c;
}
bool check(bign a){
for(int i=0;i<a.len;i++){
if(a.d[i] != a.d[a.len-i-1]){
return false;
}
}
return true;
}
void print(bign a){
for(int i=0;i<a.len;i++){
printf("%d",a.d[a.len-1-i]);
}
}
bign reverse(bign a){
bign b;
for(int i=a.len-1;i>=0;i--){
b.d[b.len++] = a.d[i];
}
return b;
}
bign add(bign a,bign b){
bign c;
int carry = 0;
//注意是两者的长度
for(int i=0;i<a.len||i<b.len;i++){
int tmp = a.d[i] + b.d[i] + carry;
c.d[c.len++] = tmp % 10;
carry = tmp / 10;
}
if(carry !=0 ){
c.d[c.len++] = carry;
}
return c;
}
int main(){
scanf("%s %d",str,&k);
int step = 0;
bign a;
bign b;
a = change(str);
//注意,万一一开始就是回文数
while(!(check(a)) && step < k){ //不是回文数,并且步数在内
b = reverse(a);
a = add(a,b);
step++;
}
if(step >= k){
print(a);
printf("\n%d",k);
}else{
print(a);
printf("\n%d",step);
}
return 0;
}
反思
- 第一次提交没过,因为自己的
maxn
设为了20,太小了!看来有些事还是要好好考虑清楚,我之前想错了,(lll¬ω¬)。实在不行,你就多开一个数量级嘛,反正内存不要钱。
二刷代码
- 二刷忘记考虑一开始就是回文数的情况了
- 我觉得一刷的代码写的比二刷的代码要好很多!!!通过一个复合判断条件来做题,我觉得很好。
//得考虑提前终止的情况
//其实就是高精度加法的情况
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string in;
int k;
struct bign{
int d[200];
int len;
bign(){
fill(d,d+200,0);
len=0;
}
};
bign change(string in){
bign res;
int len = in.size();
for(int i=0;i<len;i++){
res.d[i] = in[len-1-i]-'0';
res.len++;
}
return res;
}
bign rev(bign a){
bign res;
//不需要管前导0
for(int i=0;i<a.len;i++){
res.d[i] = a.d[a.len-1-i];
res.len++;
}
return res;
}
bign add(bign a,bign b){
bign res;
int carry=0;
for(int i=0;i<a.len||i<b.len;i++){
int tmp = a.d[i]+b.d[i]+carry;
res.d[res.len] = tmp%10;
res.len++;
carry=tmp/10;
}
if(carry!=0){
res.d[res.len] = carry;
res.len++;
}
return res;
}
bool check(bign a){
int len = a.len;
for(int i=0;i<len/2;i++){
if(a.d[i]!=a.d[len-1-i]){
return false;
}
}
return true;
}
void show(bign c){
int len = c.len;
for(int i=0;i<len;i++){
printf("%d",c.d[len-1-i]);
}
printf("\n");
return;
}
int main(){
cin>>in;
scanf("%d",&k);
bign a = change(in);
bign b;
bign c;
for(int i=1;i<=k;i++){
if(check(a)){
show(a);
printf("%d",i-1);
return 0;
}
b = rev(a);
c = add(a,b);
a = c;
}
show(c);
printf("%d",k);
return 0;
}