给定一个正整数 N ,请找出一个比 N 大的最小整数 M ,使得 M 同时满足以下两个条件:
1. M 是一个三角数:即存在一个正整数 k ,使得 M = k(k+1)/2 。
2. M 是回文数:即 M 的数字从左到右读和从右到左读相同。
例如,55 是一个符合条件的数,因为它是一个三角数(55 = 1 + 2 + 3 + … + 10)并且是一个回文数。
代码:
#include <stdio.h>
#include <math.h>
// 判断一个数是否为回文数
int isPalindrome(long long n) {
if (n < 0) return 0;
long long original = n;
long long reversed = 0;
while (n > 0) {
reversed = reversed * 10 + n % 10;
n /= 10;
}
return original == reversed;
}
// 计算三角数
long long getTriangleNumber(long long k) {
return k * (k + 1) / 2;
}
// 获取大于n的最小三角回文数
long long findNextTrianglePalindrome(long long n) {
// 计算最小的k,使得三角数大于n
long long k = (long long)sqrt(2 * n);
while (getTriangleNumber(k) <= n) {
k++;
}
// 寻找下一个三角回文数
while (1) {
long long triangleNum = getTriangleNumber(k);
if (isPalindrome(triangleNum)) {
return triangleNum;
}
k++;
}
}
int main() {
long long n = 1000; // 示例输入
printf("大于%lld的最小三角回文数是: %lld\n",
n, findNextTrianglePalindrome(n));
return 0;
}