A1024

#include<cstdio>
#include<cstdlib>
#include<string.h>
#include<math.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
struct node{
	int d[100];                             //一開始數組下標範圍給小了,只給了25,導致兩個大數的測試點過不了,題目給定K<=100,因此遇到極端情況會超數組. 
	int len;
	node(){
		memset(d,0,sizeof(d));
		len=0;
	}
};
int k=0;                                     //操作次數
bool judgePal(node res){                                     //判斷迴文 
	int len=res.len;
	for(int i=0;i<len/2;i++){
		if(res.d[i]!=res.d[len-i-1])return false;
	}
	return true;
}
node change(char n[12],int len){                              //字符數組賦至結構體 
	node ori;
	for(int i=len-1;i>=0;i--){
		ori.d[len-i-1]=n[i]-'0';
	}
	ori.len=len;
	return ori;
}
node reverseNode(node ori){                                   //反轉 
	node now;
	int len=ori.len;
	for(int i=len-1;i>=0;i--){
		now.d[len-i-1]=ori.d[i];
	}
	return now;
}
node addNode(node ori,node now){                              //大整數加法 
	node res;
	int carry=0,len=ori.len,i;
	for(i=0;i<len;i++){
		int temp=carry+ori.d[i]+now.d[i];
		res.d[i]=temp%10;
		carry=temp/10;
	}
	if(carry!=0){
		res.d[i]=carry;
		res.len=i+1;
	}else{
		res.len=i;
	}
	return res;
}
int main(){
	#ifdef ONLINE_JUDGE
	#else
		freopen("1.txt","r",stdin);
	#endif
	char n[12];
	int K,len;
	scanf("%s %d",n,&K);
	len=strlen(n);
	node ori=change(n,len);
	node res=ori,now; 
	while(1){
		if(judgePal(res)){                       //可改成ori,去掉res 
			break;
		}
		if(k>=K){
			break;
		}
		now=reverseNode(ori);
		res=addNode(ori,now);                    //可改成ori,去掉res 
		ori=res;
		k++;
	}
	for(int i=res.len-1;i>=0;i--){
		printf("%d",res.d[i]);
	}
	printf("\n%d",k);
	return 0;
}

algorithm中有現成的reverse函數,不用自己寫.
算法筆記中的while循環寫得思路更清晰,只需操作兩個結構體即可.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章