素数 | ||
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ] | ||
Acceteped : 45 | Submit : 101 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB | |
Description | ||
Prime题目描述一个无前导零的正整数n=a0a1…ak¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯,对于区间(i,j),0≤i≤j≤k,可得p=ai…aj¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯,且p是一个素数。比如25,那么我们可以取区间(0,0),(1,1),分别得到2,5都是素数;237,那么我们可以取区间(0,0),(1,1),(2,2),(0,1),(1,2),分别得到2,3,7,23,37都是素数。现在已知n,求存在多少个这样的区间? 输入第一行是一个整数T(1≤T≤3000),表示样例的个数。 以后每行一个样例,为一个整数n(1≤n≤109) 输出每行输出一个样例的结果。 样例输入3 25 237 46 样例输出2 5 0 |
Source Code
Problem: 1332 User: 202205567311
Memory: 1140K Time: 31MS
Language: G++ Result: Accepted
Source Code
#include<stdio.h>
int bits[16];
int isprime(int a) {//判断是否为素数
if(a==1||a==0) return 0;
static int i;
for ( i = 2; i * i <= a; i++) {
if (!(a % i)) return 0;
}
return 1;
}
int turnbits(int a) {//把每一位取出来
static int i;
i = -1;
while (a > 0) {
bits[++i] = a % 10;
a /= 10;
}
return i;
}
int bitssq(int start, int end, int maxbits) {//取一个数中的一部分
static int g, i, sum;
g = 1, sum = 0;
for ( i = maxbits - end; i <= maxbits - start; i++, g *= 10) sum+=bits[i]*g;
return sum;
}
int main(){
int i,j,t,n,bit,sum;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
bit=turnbits(n);
sum=0;
for( i=0;i<=bit;i++){
for( j=i;j<=bit;j++){
sum+=isprime(bitssq(i,j,bit));//遍历每种情况
}
}
printf("%d\n",sum);
}
}