特殊回文数的因子
给定一个范围[a, b],找出这个范围内所有满足以下条件的数:
- 这个数是回文数
- 这个数的所有质因子也都是回文数
- 这个数至少有两个不同的质因子
输入格式:
两个整数 a 和 b (1 ≤ a < b ≤ 10000)
输出格式:
按升序输出所有满足条件的数,每个数占一行。
同时输出这个数的所有回文质因子(按升序,用空格分隔)。
如果没有找到满足条件的数,输出"None"。
示例输入:
100 200
示例输出:
121 11 11
141 3 47
解释:
- 121 = 11 × 11,11是回文质数
- 141 = 3 × 47,3和47都是回文质数
这道题目综合了:
- 回文数判断
- 质因数分解
- 判断质数是否为回文数
- 结果的格式化输出
- 多重条件判断
解答:
#include <stdio.h>
int huiwen(int n)
{
int temp = n;
int count = 0;
while (temp > 0)
{
temp /= 10;
count++;
}
temp = n; // 重新赋值
int a[count];
for (int i = 0; i < count; i++)
{
a[i] = temp % 10;
temp /= 10;
}
for (int i = 0; i < count; i++)
{
if (a[i] != a[count - i - 1])
{
return 0;
}
}
return 1;
}
int findPrimeFactors(int n)
{
// 处理所有的2
int count = 0; // 用于记录回文质因子的个数
if (n % 2 == 0)
{
if (!huiwen(2)) return 0; // 如果2是因子但不是回文数,直接返回0
count = 1;
while (n % 2 == 0)
{
n = n / 2;
}
}
// 处理其他可能的质因数
for (int i = 3; i * i <= n; i = i + 2)
{
if (n % i == 0) // 如果i是因子
{
if (!huiwen(i)) return 0; // 如果因子不是回文数,直接返回0
count++;
while (n % i == 0)
{
n = n / i;
}
}
}
// 如果n大于2,说明n本身就是质数
if (n > 2)
{
if (!huiwen(n)) return 0; // 如果最后的因子不是回文数,返回0
count++;
}
return count >= 2; // 至少要有两个不同的回文质因子
}
void printPrimeFactors(int n)
{
printf("%d ", n); // 先打印数字本身
// 处理所有的2
if (n % 2 == 0)
{
printf("2 ");
while (n % 2 == 0)
{
n = n / 2;
}
}
// 处理其他可能的质因数
for (int i = 3; i * i <= n; i = i + 2)
{
if (n % i == 0)
{
printf("%d ", i);
while (n % i == 0)
{
n = n / i;
}
}
}
// 如果n大于2,说明n本身就是质数
if (n > 2)
{
printf("%d", n);
}
printf("\n");
}
int main()
{
int a, b;
scanf("%d %d", &a, &b);
int found = 0;
for (int i = a; i <= b; i++)
{
if (huiwen(i) && findPrimeFactors(i))
{
found = 1;
printPrimeFactors(i);
}
}
if (!found)
{
printf("None\n");
}
return 0;
}