考试前一晚上存档(常回来看看回来看看~)(差不多了吧)

Problem K: 十六进制转二进制

get 十六进制每一位对应一四个二进制,直接把每一位写出存数组里然后直接输出,爽

在这里插入代码片

妙蛙的方法,虽然我是打表做&没看懂人家的代码吧(笑cry),但是起码记住了判断素数的另一种方法?

雪岩ding的代码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int isPrime(unsigned long long int m)
{
    if(m==1)return 0;//直接对前三个数一一举出就行,因为前三个数并不是很符合素数递增规律
    if(m==2)return 1;
    if(m==3)return 1;

    if(m%6!=1&&m%6!=5)return 0;//只要是素数对6取余一定等于1或5(这里指除2 3 之外的素数)
    else{
        unsigned long long int t=sqrt(m);
        for(int i=5;i<t;i+=6){
            if(m%i==0||m%(i+2)==0)return 0;
        }
        return 1;
    }
}

int main()
{
    int p;
    while(scanf("%d",&p)!=EOF){
        unsigned long long int m=pow(2,p)-1;
        if(isPrime(p)&&isPrime(m)){//是梅森素数必须要p是素数且2^p-1也是素数!
            printf("%llu\n",m);
        }else{//不是素数就输出no
            printf("no\n");
        }
    }
    return 0;
}


## 不会but粘了就是会了(误),路漫漫…

Problem O: 第几个素数
Description
已知2是第一个素数,3是第二个、5是第三个……现在编程序求第k个素数是什么?所求素数均小于10000000。

根据素数定理,不超过x的素数的个数近似于x/ln(x),根据标程测得的数据,不超过10000000的素数不到66万5千个。

建议:分配动态内存。

Input
输入多个整数k,至EOF结束。输入不超过50个整数。

本题共5组测试样例,k的范围和个数满足:

第一组:k<=100,不超过10个;

第二组:k<=1000,不超过10个;

第三组:k<=10000,不超过20个;

第四组:k<=100000,不超过30个;

第五组:k<=1000000,不超过50个。
Output
输出第k个素数。
Sample Input

1
2
3
5
10
100
1
2
3
4
5
6
Sample Output

2
3
5
11
29
541
1
2
3
4
5
6
HINT
当你遇到如下编译错误时,可以考虑分配动态内存。

gcc: Internal error: File size limit exceeded (program as) Please
submit a full bug report. See
<file:///usr/share/doc/gcc-4.4/README.Bugs> for instructions.

试题分析:

这题好吗?这题不好,恶俗的卡时间题!但仔细做做之后,其实这里面蕴含了很好的数学问题和算法思想!

1)找到素数递增的规律,这道题才能迎刃而解

对于前三个素数2 3 5要直接填入,因为这三个数并不是很符合素数的递增.规律!
2.对于后面的每一个素数,如果前一个素数对3取余为1要加4;
如果前一个素数对3取余为2要加2;
时刻要保持为素数!(这里使用的是do-while循环)
这个题也隐含了空间换时间的思想!
ans:

#include<stdio.h>
#include<stdlib.h>

int isPrime(int num,int *m)//判断是否是素数的函数
{
    for(int i=1;m[i]*m[i]<=num;i++){
        if(num%m[i]==0)return 0;
    }
    return 1;
}

int ans(int *m,int max)
{
    int i=*(m+max);
    do{
        if(i%3==2)i+=2;//对3取余2要+2;
        else if(i%3==1)i+=4;//对3取余1+4;
    }while(isPrime(i,m)==0);//如果不是素数就一直循环
    return i;
}

int main()
{
    int *m=(int*)malloc(sizeof(int)*665000);//根据要求动态分配内存
    *(m+1)=2;//由于前三个不是很符合素数递增的规律,就先赋上值
    *(m+2)=3;
    *(m+3)=5;
    int max=3;
    int k;
    while(scanf("%d",&k)!=EOF){//并没有一下把所有素数都求出来而是给一个k求一次,并依次填入数组中
        while(k>max){
            *(m+max+1)=ans(m,max);
            max++;
        }
        printf("%d\n",*(m+k));
    }
    free(m);//释放空间
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值