pat知识点复习--day76

如果筛选素数sqrt(n),然后挨个统计进去,复杂度是nsqrt(n)

#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
bool isPrime(int n)
{
    if(n<=1)
        return false;
    int temp=(int)sqrt(n);
    for(int i=2;i<=temp;i++)
        if(n%i==0) return false;
    return true;
}
int prime[105];//存prime的具体数值
int pNum=0;
bool p[105]={0};//存每个位置是不是素数,按实际下标没有偏移量
void findprime(int n)
{
    for(int i=1;i<=n;i++)
        if(isPrime(i))
    {
        prime[pNum++]=i;
        p[i]=1;
    }
}
int main()
{
    findprime(100);
    for(int i=0;i<pNum;i++)
        printf("%d ",prime[i]);
    return 0;
}
View Code

可以使用素数筛,这时候要注意 bool p[105]={0}是可以的,都赋值成1是不可以的哦!

因为是在判定中标记非素数,所以只能是素数0非素数1这样设定了。

另外记得内循环是从2*i开始的,不是i

#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int prime[105];//存prime的具体数值
int pNum=0;
bool p[105]={0};//存每个位置是不是素数,按实际下标没有偏移量
void findprime(int n)
{
    p[0]=1;
    p[1]=1;
    p[2]=0;
    for(int i=2;i<=n;i++)
    {
        for(int j=i+i;j<=n;j=j+i)
            p[j]=1;
    }
    for(int i=2;i<=n;i++)
    {
        if(p[i]==0) prime[pNum++]=i;
    }
}
int main()
{
    findprime(100);
    for(int i=0;i<pNum;i++)
        printf("%d ",prime[i]);
    return 0;
}
View Code

注意!!!素数筛里面2一定要筛!不是2规定了素数就完事儿了!不然4这种筛不掉(其实规定2素数那一步很没必要)

求多个或者范围内用打表,打表一个函数就够了。求某一个是不是素数用sqrt那个

PAT B1013找素数 

里面是prime[x-1]代表的第x个数哦

刚开始写错了,赶上素数筛写的也有点问题。。居然把样例过去了,题很简单

#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int prime[120000];//存prime的具体数值
int pNum=0;
bool p[120000]={0};//存每个位置是不是素数,按实际下标没有偏移量
int n,m;
void findprime(int n)
{
    p[0]=1;
    p[1]=1;
    p[2]=0;
    for(int i=2;i<=n;i++)
    {
        for(int j=i+i;j<=n;j=j+i)
            p[j]=1;
    }
    for(int i=2;i<=n;i++)
    {
        if(p[i]==0) prime[pNum++]=i;
    }
}
int main()
{
    scanf("%d %d",&m,&n);
    findprime(110000);
    for(int i=m;i<=n;i++)
        if((i+1-m)%10 &&i!=n)
            printf("%d ",prime[i-1]);
        else /*if((i+1-m)%10==0)*/
            printf("%d
",prime[i-1]);
        /*else
            printf("%d",prime[i-1]);*/
    return 0;
}#include<stdio.h>
#include<math.h>
#include<string.h>
using namespace std;
int prime[120000];//存prime的具体数值
int pNum=0;
bool p[120000]={0};//存每个位置是不是素数,按实际下标没有偏移量
int n,m;
void findprime(int n)
{
    p[0]=1;
    p[1]=1;
    p[2]=0;
    for(int i=2;i<=n;i++)
    {
        for(int j=i+i;j<=n;j=j+i)
            p[j]=1;
    }
    for(int i=2;i<=n;i++)
    {
        if(p[i]==0) prime[pNum++]=i;
    }
}
int main()
{
    scanf("%d %d",&m,&n);
    findprime(110000);
    for(int i=m;i<=n;i++)
        if((i+1-m)%10 &&i!=n)
            printf("%d ",prime[i-1]);
        else /*if((i+1-m)%10==0)*/
            printf("%d
",prime[i-1]);
        /*else
            printf("%d",prime[i-1]);*/
    return 0;
}
View Code

 PAT A1059分解质因数

质因数不会大于10,因为最小的10个质数相乘就爆炸int

另外大于sqrt的最多只有一个,节约时间。最开始开质数表开到1e5足够大了,如果开成n有时候太浪费了

因为n在不断被除,这时候要有变量存住,不然sqrtn和n都在变化

在小于sqrt的质数中遍历,除到不能再整除为止。

在处理大于sqrt的时候,如果有就是剩下的n本身,数量为1。

注意因为使用了结构体,不要在修fac.x和fac.cnt的时候重复修改count

最后一个没有乘号,大于1个的因子用^

1的时候需要特判输出1=1

#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int prime[100005];
int pNum=0;
bool p[100005]={0};//0为素数
void findprime(int n)
{
    p[0]=1;
    p[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(p[i]==0)
            prime[pNum++]=i;
        for(int j=i+i;j<=n;j=j+i)
            p[j]=1;
    }
}
struct factor
{
    int x,cnt=0;
}fac[10];
int main()
{
    int n;
    scanf("%d",&n);
    if(n==1)
    {
        printf("1=1");
        return 0;
    }
    findprime(100000);
    int count=0;
    int temp=sqrt(n);
    int tempn=n;
    for(int i=0;i<pNum;i++)
    {
        if(prime[i]>temp)
            break;
        if(n%prime[i]==0)
        {
            //printf("hah%d
",prime[i]);
            fac[count].x=prime[i];
            fac[count].cnt++;
            n=n/prime[i];
            while(n%prime[i]==0)
            {
                fac[count].cnt++;
                n=n/prime[i];
            }
            count++;
            //printf("%d %d
",fac[count-1].x,fac[count-1].cnt);
        }
    }
    if(n!=1)
    {
        fac[count].x=n;
        fac[count++].cnt=1;
    }
    printf("%d=",tempn);
    for(int i=0;i<=count-1;i++)
    {
        if(fac[i].cnt>1)
        {
            printf("%d^%d",fac[i].x,fac[i].cnt);
        }
        else
        {
            printf("%d",fac[i].x);
        }
        if(i!=count-1)
            printf("*");
    }
    return 0;
}
View Code
时间才能证明一切,选好了就尽力去做吧!
原文地址:https://www.cnblogs.com/tingxilin/p/12268649.html