|
发表于 2024-4-7 22:07:32
|
显示全部楼层
本帖最后由 jackz007 于 2024-4-7 23:28 编辑
- #include <stdio.h>
- int main(void)
- {
- int e[8] , i , j , k , m , n ;
- for(m = 999 * 999 ; m > 9999 ; m --) { // 让 m 从 999 x 999 循环到 100 x 100,逐个筛选符合条件的 m
- for(k = 100 ; k < 1000 ; k ++) {
- if(! (m % k) && (m / k) > 99 && (m / k) < 1000) break ; // 如果 m 可以被一个三位数整除,商也是一个三位数,那就 break
- }
- if(k < 1000) { // 此条件成立,说明前面的循环 break 结束,m 是两个三位数的乘积
- for(i = m , n = 0 ; i ; i /= 10 , n ++) e[n] = i % 10 ; // 把 m 的各个位上的数值存入数组 e
- for(i = 0 ; i < n / 2 ; i ++) if(e[i] != e[n - 1 - i]) break ; // 按首尾对称位置逐位比较 m 的各个位,如果不等,那就 break
- if(i >= n / 2) { // 此条件成立,说明前面的循环没有执行 break 语句,m 是一个回文数
- printf("%d = %d x %d\n" , m , k , m / k) ;
- break ;
- }
- }
- }
- }
复制代码
编译、运行实况:
- D:\[exercise]\C>g++ -o x x.c
- D:\[exercise]\C>x
- 906609 = 913 x 993
- D:\[exercise]\C>
复制代码
如果去掉第 15 行的 break,可以得到所有符合两个三位数乘积的回文数:
可以看到,一共有 655 个回文数,其中的 580085 并不是最大的回文数,因为,在它的前面,还排有 64 个符合条件而且数值更大的回文数。 |
|