zoukankan      html  css  js  c++  java
  • 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
    时间才能证明一切,选好了就尽力去做吧!
  • 相关阅读:
    UVa OJ 148 Anagram checker (回文构词检测)
    UVa OJ 134 LoglanA Logical Language (Loglan逻辑语言)
    平面内两条线段的位置关系(相交)判定与交点求解
    UVa OJ 130 Roman Roulette (罗马轮盘赌)
    UVa OJ 135 No Rectangles (没有矩形)
    混合函数继承方式构造函数
    html5基础(第一天)
    js中substr,substring,indexOf,lastIndexOf,split等的用法
    css的textindent属性实现段落第一行缩进
    普通的css普通的描边字
  • 原文地址:https://www.cnblogs.com/tingxilin/p/12268649.html
Copyright © 2011-2022 走看看