c015 - 10018 - Reverse and Add
題目描述
題目要求給定一個整數,重複執行反轉數字並加回原數字的步驟,直到得到一個迴文數。輸出得到迴文數所需的步驟次數以及迴文數本身。
解題思路
這個問題的核心是模擬題目描述的步驟。對於給定的數字,我們需要反轉它,然後將反轉後的數字加回原始數字。重複這個過程,直到得到的數字是迴文數。判斷一個數字是否為迴文數,可以比較原始數字和反轉後的數字。程式碼中,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;
}
}
}