题目描述
一个数字无论从前往后还是从后往前都是一样的,这就是回文数。例如,1234321是回文数。
非回文数可以通过一系列操作与回文数配对。首先,将非回文数反转,并将结果添加到原始数字中。如果结果不是回文数,则重复此操作,直到得到回文数。
例如,从67开始,我们可以分两步得到回文数:67 + 76 = 143 , 143 + 341 = 484。
给定任何正整数N,你应该可以找到它的成对回文数和找到它所花费的步数。
输入描述:
输入包含一个测试用例。每种情况由两个正数N和K组成,其中N (N
≤
≤
1
0
16
10
16
)是初始数,K(K
≤
≤100)是最大步数。这两个数字之间用一个空格隔开。
输出描述:
对于每个测试用例,输出两个数字,每行一个。第一个数字是成对的回文数N,第二个数字是找到回文数所需的步数。
如果K步后没有找到回文数,则只输出第K步得到的数和K。
输入数据 1
67 3
输出数据 1
484
2
输入数据 2
69 3
输出数据 2
1353
3
供参考:
#include <stdio.h>
int fun(int n) // 逆序一个数
{
int ret = 0;
while (n){
ret = ret * 10 + n % 10;
n /= 10;
}
return ret;
}
int main()
{
int N, K, k = 0;
scanf("%d%d", &N, &K);
while (1) {
if (N == fun(N))// 判断是否是回文数
break;
else{ // 将非回文数反转,并将结果添加到原始数字中
N += fun(N);
k++;
}
if (k == K) // 如果K步后没有找到回文数,跳出
break;
}
printf("%d\n%d\n", N, k);// 输出
return 0;
}
每一步加上自己的倒序数后,都作“回文”判断,如果回文数,则返回回文数和次数。
用10取余获个位数字,连续整除10,得到其它数位数字。
#!/sur/bin/nve python
# coding: utf-8
def reverse(num):
''' 反转整数 '''
result = 0
while 1:
if not num:
return result #
result = result*10 + num%10
num //= 10 # 整数整除10。
def is_palindromic(num, k):
''' 回文数判定 '''
for i in range(k): # 遍历轮询k次。
num += reverse(num)
if num == reverse(num):
return num, i+1
return num, i+1
if __name__ == '__main__':
num, k = 110967, 5
print(f"\n输入参数:\n{num}, {k}\n\n输出:")
print(*is_palindromic(num, k))
def reverse(num): # 返转函数也可以用列表写。
''' 反转整数 '''
result = []
while 1:
if not num:
break
result.insert(len(result), num%10) # 在列表末尾插入当前数位数字。
num //= 10 # 整数整除10。
k = len(result)-1 # 数位指数初值。num已是0,不用重赋初值。
for i in result[:]:
num += i*10**k
k -= 1
return num # 返回反转后的整数。
def is_palindromic(num, k):
''' 回文数判定 '''
for i in range(k): # 遍历轮询k次。
num += eval(str(num)[::-1]) # 字符串切片反转整数。
if str(num) == str(num)[::-1]:
return num, i+1
return num, i+1
if __name__ == '__main__':
print(*is_palindromic(97, 13))