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;
}