好像大家都是这么写的,稍微改良一下,去掉了“字符串”这个东西,也去掉了itoa,sprintf这些相关的东西,这些奇奇怪怪的东西,用了就出事【doge】
素数字符串 | ||
[ Submit Code ] [ Top 20 Runs ] [ Runs Status ] | ||
Acceteped : 311 | Submit : 1115 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB | |
Description | ||
素数字符串题目描述我们将素数从小到大依次书写,可以得到一个字符串"23571113⋯",已知一个数码d(0≤d≤9),求字符串在区间[L,R]之间的多少个d? 输入第一行是一个整数T(1≤T≤10000),表示样例的个数。 每个样例是一行, 为3个整数,区间L,R,(1≤L≤R≤1000000)和数码d。 区间从1开始计数。 输出每行输出一个样例的结果。 样例输入2 1 8 1 1 8 4 样例输出3 0 | ||
Sample Input | ||
Sample Output | ||
Source |
Source Code
Problem: 1345 User: 202205567311
Memory: 52088K Time: 187MS
Language: G++ Result: Accepted
Source Code
#include<stdio.h>
#define maxnum 1000005
#define primenum 3000005
int primeio[primenum] = {1, 1};
int disk[10];
int pointer = 1;
int counttime[10][maxnum + 20];
int writedisk(int input) {
int whitepoint = -1;
while (input > 0) {
whitepoint++;
disk[whitepoint] = input % 10;
input /= 10;
}
return whitepoint;
}
int main() {
int i, j;//稍微改良了一下欧拉筛,但时间好像也没差多少oops~
for (i = 4; i <= primenum; i += 2) {
primeio[i] = 1;
}
for ( i = 3; i * i <= primenum; i += 2) {
if (!primeio[i]) {
for ( j = i * i; j <= primenum; j += i) {
primeio[j] = 1;
}
}
}
int disktime=0;
for ( i = 2; i <= primenum; i++) {
if (pointer >= maxnum+15)break;
if (!primeio[i]) {
disktime = writedisk(i);
while (disktime >= 0) {
counttime[disk[disktime] - 0][pointer]=1;
pointer++;
disktime--;
}
}
}
for ( i = 0; i <= maxnum + 2; i++) {
for ( j = 0; j <= 9; j++) {
counttime[j][i] += counttime[j][i - 1];
}
}
int L, R, d, k;
scanf("%d", &k);
while (k--) {
scanf("%d %d %d", &L, &R, &d);
printf("%d\n", counttime[d][R] - counttime[d][L-1]);
}
}