|  | 
 
 发表于 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 个符合条件而且数值更大的回文数。
 | 
 |