# Number Theory# Palindrome# Iteration

c015 - 10018 - Reverse and Add

🔗 前往 ZeroJudge 原題

題目描述

題目要求給定一個整數,重複執行反轉數字並加回原數字的步驟,直到得到一個迴文數。輸出得到迴文數所需的步驟次數以及迴文數本身。

解題思路

這個問題的核心是模擬題目描述的步驟。對於給定的數字,我們需要反轉它,然後將反轉後的數字加回原始數字。重複這個過程,直到得到的數字是迴文數。判斷一個數字是否為迴文數,可以比較原始數字和反轉後的數字。程式碼中,b1 儲存原始數字,b2 儲存反轉後的數字,c 記錄相加的次數。迴圈持續進行,直到原始數字和反轉後的數字相等(迴文)或達到最大迭代次數(題目限制在 1000 次內)。

複雜度分析

  • 時間複雜度: O(n * k),其中 n 是迭代次數(最壞情況下為 1000),k 是數字的位數(用於反轉和判斷迴文)。
  • 空間複雜度: O(1),因為我們只使用了幾個整數變數來儲存數字和計數器,空間使用不隨輸入大小變化。

程式碼

#include <iostream>
#include <cmath>
using namespace std;
int main(){
	long long int a;
	cin >> a;
	while(cin >> a){
		long long int b1=0,b2=0,c=0;
		while(1){
			b1=a;
			b2=0;
			while(a>0){
				b2*=10;
				b2+=a%10;
				a/=10;
			}
			long long int c1=b1,c2=b2,n=log10(b1)+1;
			for(int i=0;i<n/2;i++){
				c1/=10;
				c2/=10;
			}
			if(c1==c2&&c!=0){
				cout <<c<<" "<< b1 << "\n";
				break;
			}
			c++;
			a=b1+b2;	
		}
	}
}

Discussion