标签:max i+1 math mes 简单 break int cti com
题解:
第一次:
算法复杂度过高,导致编译超时,需要优化
#include<stdio.h>
#include<math.h>
int a[100000001] = { 0 };
int p(int n) {
int t = n, ret = 0;
while (t > 0) {
t /= 10;
ret++;
}
if (ret == 1) {
printf("%d\n", n);
return 0;
}
t = ret;
t /= 2;
ret -= 1;
while (n > 0 && t > 0) {
int a=n /pow(10, ret);
if (n % 10 == a ) {
n %= (int)pow(10, ret);
n /=10;
ret -= 2;
t--;
}
else {
return 0;
}
}
return 1;
}
int main()
{
int A, B, i, j;
scanf("%d %d", &A, &B);
//0:质数,1:合数
for (i = 2; i < sqrt(B); i++) {
for (j = i+1; j <= B; j++) {
if (j % i == 0 && a[j] == 0) {
a[j] = 1;
}
}
}
for (i = A; i <= B; i++) {
if ( a[i] == 0&&p(i)) {
printf("%d\n", i);
}
}
return 0;
}
自己的尝试还是差最大的数据:
for (j = 6; j < 10000000; j += 2) {
a[j] = 1;
}
for (i = 3; i <3163; i+=2) { //sqrt()
for (j = i*2; j <= 10000000; j+=i) {
if ( a[j] == 0) {
a[j] = 1;
}
}
}
看了题解后:
1.我认为简单的判断回文数的代码:
bool pd_h(int x)
{
int y=x,num=0;
2.你会发现,6同时被2和3各筛了一次。它在计算时就被访问了两次,这样会导致效率低下。
原理:对于任意合数,必定可以有最小质因子乘以最大因子的分解方式。因此,对于每个合数,只要用最大因子筛一遍,枚举时只要枚举最小质因子即可。
int vis[MAXN];
int prime[MAXN];
void Prime()
{
int cnt=0;
for(int i=2;i<=n;i++)
{
if(!vis[i]) prime[cnt++]=i;
for(int j=0;j<cnt&&i*prime[j]<=n;j++)
{
vis[i*prime[j]]=i;
if(i%prime[j]==0) break;
}
}
}
P1217 [USACO1.5]回文质数 Prime Palindromes
标签:max i+1 math mes 简单 break int cti com
原文地址:https://www.cnblogs.com/lijiahui-123/p/12240025.html