Problem 7
10001st prime
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.
What is the 10 001st prime number?
第10001个质数
前6个质数分别是2、3、5、7、11和13。
第10 001个质数是多少?
/*
*
* Program 1
* 思路:
* 1.由小到大遍历所有整数,
* 2.找到第10001个符合要求的数即是答案
* 收获:
* 1.1. void*用法
* 评价:
* 优点:
* 1.思路简单
* 缺点:
* 1.需要遍历比答案小的所有整数并作判断
* 2.引用 sqrt()函数
*
*/
#define SERIAL_NUMBER 10001
#include <stdio.h>
#include <math.h>
/*-------------------------------------------*/
typedef unsigned long long ullong;
//判断正整数 num是否是质数
//返回值:
// 1 num是质数
// 0 num不是质数
short IsPrimeNumber(ullong num)
{
ullong i = 2;
for (i = 2; i <= (ullong)sqrt(num); i++)
{
if (!(num % i))
break;
}
if (i > (ullong)sqrt(num))
{
return 1;
}
else
{
return 0;
}
}
int main()
{
unsigned int flag = SERIAL_NUMBER;
ullong i = 2;
while (flag)
{
if (IsPrimeNumber(i++))
flag--;
}
printf("%lld\n", --i);
return 0;
}
/*--------------------- no so successful --------------------*/
//判断元素 element,是否在数组 arr中,
//数组类型的大小为 sizeOfType,数组大小为 sizeOfArr
//返回值:
// -1 该元素不在数组中
// 自然数 在数组中第一次出现时的下标
int IsInArray(void* element, void* arr, int sizeOfType, int sizeOfArr)// 收获1.1
{
//遍历数组中的每一个元素
for (int i = 0; i < sizeOfArr / sizeOfType; i++)
{
//遍历元素的每一字节
int flag = sizeOfType;
for (int j = 0; j < sizeOfType; j++)
{
if (*((char*)arr + i * sizeOfType + j) != *((char*)element + j))
{
break;
}
flag--;
}
if (!flag)
{
return i;
}
}
return -1;
}
// 100以内质数表,共计 25个
int primeNumArr[25] = { 2,3,5,7,11,13,17,19,23,29,
31,37,41,43,47,53,59,61,67,71,73,79,83,89,97 };