东方博宜OJ 1137:纯粹素数 ← 约数的成对性
【题目来源】
【题目描述】
纯粹素数是这样定义的:一个素数,去掉最高位,剩下的数仍为素数,再去掉剩下的数的最高位,余下的数还是素数。这样下去一直到最后剩下的个位数也还是素数。
求出所有小于 3000 的四位的纯粹素数。
【输入格式】
无
【输出格式】
按从小到大的顺序输出若干个纯粹素数,每行一个。
【算法分析】
● 约数的成对性:对于任意整数 x,如果 i 是 x 的约数,那么 x/i 也是 x 的约数。
这意味着,如果 i×j=x,那么在这对约数 (i,j) 中,必然有一个小于或等于 sqrt(x)。另一个大于或等于 sqrt(x)。只有当 x 是完全平方数时,两者相等。
● 判定素数的经典代码:
本素数判定的经典代码,就利用了“约数的成对性”。
● 本题的难点,在于如何多次去掉数的最高位。巧妙之处在于利用 while 循环进行求余操作。即:若去掉 n 位数的最高位,则将其对 10 的 n-1 次方求余。例如,若去掉 127 的最高位,则需计算 127%100 的值。
例题:给定正整数 N,反复去掉当前数的最高位得到新数,并将每次生成的新数(含初始数 N 本身)累加,直至剩余数字为一位数时停止。
【算法代码】
基于“约数的成对性”优化编写判定素数的代码。
【参考文献】

浙公网安备 33010602011771号