• 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
    时间才能证明一切,选好了就尽力去做吧!
  • 相关阅读:
    java获取客户端用户真实ip
    electron制作上位机软件篇(三)启动项目并进行打包
    electron制作上位机软件篇(二)使用serialport进行串口通信
    electron制作上位机软件篇(一):编译安装serialport
    STM32学习篇-蜂鸣器
    STM32学习篇-跑马灯
    日志级别的选择:Debug、Info、Warn、Error还是Fatal
    常用的正则验证
    kindEditor富文本编辑器
    表单验证jq.validate.js
  • 原文地址:https://www.cnblogs.com/tingxilin/p/12268649.html
Copyright © 2020-2023  润新知