Circular primes
The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime.
There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.
How many circular primes are there below one million?
题目:
我们称 197 为一个循环质数,因为它的所有轮转形式: 197, 971 和 719 都是质数。
100 以下有 13 个这样的质数: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 和 97.
100 万以下有多少个循环质数?
这个题目的是求一个数,将他每一最后一位移到最前面去,然后再去判断移动后的数是否为质数,当循环到与循环还开始时相等循环结束;
现在的问题就是如何去循环得到所需要的循环数,其实很简单就是把这个数最后一位取出来然后对原先的数除以十,刚刚取出最后一位的数乘以这个数之前位数的10次方,然后加上刚才数除以十的结果;
然后这里需要用到线性筛进行来判断这个数是否为质数;
代码如下:
#include <stdio.h> #include <math.h> #define MAX_N 1000000 int prime[MAX_N + 5]; int isprime[MAX_N + 5]; void init() {//初始化质数筛 for (int i = 2; 2 * i <= MAX_N; i++) { if (!isprime[i]) prime[++prime[0]] = i; for (int j = 1; i * prime[j] <= MAX_N; j++) { isprime[i * prime[j]] = 1; if (i % prime[j] == 0) break; } } } int all_is_prime(int x) { int s = x; do { s = s % 10 * pow(10, floor(log10(s))) + s / 10;//取出这个数的最后一位进行往前移 if (isprime[s]) return 0;//判断这个数是否为质数 } while(s != x); return 1; } int main() { init(); int cnt = 0; for (int i = 2; i < MAX_N; i++) { if (isprime[i] || !all_is_prime(i)) continue;//如果这个数本身就不是质数就执行下一个,如果这个数不满足题目要求也继续 cnt++; } printf("%d\n", cnt); return 0; }
最终答案:55