close
Content

把一個數字反轉並相加的方法很簡單:就是把數字反轉並加上原來的數字。假如這個和不是一個迴文(指這個數字從左到右和從右到左都相同),就一直重複這個程序。舉例說明:

195 開始的數字
591
-----
786
687
-----
1473
3741
-----
5214
4125
-----
9339 迴文出現了

在這個例子中,經過了4次相加後得到了迴文9339。幾乎對所有的整數這個方法都會得到迴文,但是也有有趣的例外。196是第1個用這個方法找不到迴文的數字,然而並沒有證明該迴文不存在。

現在給你一個開始的數字,你的任務就是求出經過多少次相加後,會產生哪一個迴文。對所有的測試資料,你可以假設:1. 都會有1個答案。2. 在1000個相加內都會得到答案。 3. 產生的迴文不會大於4294967295.

Input

第1列有一個整數N(0 < N <= 100),代表以下有幾組測試資料。每筆測試資料一列,各有1個整數 P,就是開始的數字。

Output

對每一測試資料,請輸出2個數字:得到迴文所需的最少次數的相加,以及該迴文。

Sample Input #1
5
195
265
750
2
99
Sample Output #1
4 9339
5 45254
3 6666
1 4
6 79497

C++

#include <iostream>
#include <algorithm>
using namespace std;
  

bool solve(long long int &p){  //p=195  C++寫引數一定要用指標歐!!!,不然裡面做完的動作面又會還原
	string s=to_string(p); //s="195"
	reverse(s.begin(),s.end()); //s="591"
	long long int reverse_p=stoll(s); //reverse_p=591
	p+=reverse_p; //p=195+591
	s=to_string(p);
	for (int i = 0,j=s.size()-1;i<=j; i++,j--)
	{
		if (s[i]!=s[j]){return false;}
	}
	return true;
}


int main() {
    int t;
	cin>>t;
	while (t--)
	{
		long long int p;
		cin>>p;
		int ans=1; //計算翻轉次數
				   //例如2進次翻轉相加後為4,他就不會進去while條件裡面,但他翻轉次數是1,所以初始設為1
		while (solve(p)==false){ans++;}
		cout<<ans<<" "<<p<<"\n";
	}
    return 0;
}

python:

N = int(input())
for _ in range(N):
    n=int(input())
    ans=0
    flag=False
    while flag==False:
        ans+=1
        reverse_n=int(str(n)[::-1])
        p=reverse_n+n
        reverse_p=int(str(p)[::-1])
        n=p #準備下一次
        if p==reverse_p:flag=True
        else:flag=False
    print(ans,p)

arrow
arrow
    文章標籤
    高中生程式解題 python C++
    全站熱搜
    創作者介紹
    創作者 趴趴熊日常 的頭像
    趴趴熊日常

    資工趴趴熊的小天地

    趴趴熊日常 發表在 痞客邦 留言(3) 人氣()