2.1: 判断一个正整数是否为质数的算法。函数签名如下
int isPrime(long a)
输入:一个长整数a
int isPrime(long a)
输入:一个长整数a
输出:返回1(为质数),返回0(非质数)
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
using namespace std;
int isPrime(long a)
{
long temp = (long)sqrt(a);
for (long i = 2; i <= temp; ++i)
{
if (0 == a % i)
return 0;
}
return 1;
}
int main()
{
long p;
cout<<"请输入要检测的正整数:";
cin>>p;
if(isPrime(p))
{
cout<<p<<"是质数!"<<endl;
}
else
{
cout<<p<<"不是质数!"<<endl;
}
return 0;
}
2.2: 随机生成一个n bit位的长整数。函数签名如下
long createRndInteger(int n)
输入:随机数bit位的长度为n(解释:3bit位,则最大为111,最小为100;n bit位,则该数字二进制长度为n)
输出:返回该随机数
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstdlib>
using namespace std;
long createRndInteger(int n)
{
srand( time(NULL) ); //设置随机数种子
unsigned long first = pow(2,n-1); //可取的第一个随机数
unsigned long extent(first); //随机数取数范围右边界:extent
unsigned long ret = rand()%extent ; //随机数取数范围:0~extent
return ret + first; //输出结果=可取的第一个随机数+加上范围中取得的随机数
}
int main(int argc,char* argv[])
{
int input;
if (argc > 1)
{
//input = atoi(argv[1]);//取第一个参数
input = atoi(argv[argc-1]);//取最后一个参数
}
else
{
cout<<"请输入随机数bit位的长度n:";
cin>>input;
}
/*
cout<<"请输入随机数bit位的长度n:";
cin>>input;
*/
cout<<"取得的bit位长度n="<<input<<"的随机数为:"<<createRndInteger(input)<<endl;
return 0;
}
2.3:随机生成一个n bit位的长质数。函数前面如下
long createRndPrime(int n)
输入:随机质数的bit位长度为n
输出:nbit位长度的质数
关键为使用随机化算法判断一个长整数是否为素数(P33)。
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstdlib>
using namespace std;
int isPrime(long a);
long createRndInteger(int n);
long createRndPrime(int n);
int main(int argc,char* argv[])
{
int input;
if (argc > 1)
{
//input = atoi(argv[1]);//取第一个参数
input = atoi(argv[argc-1]);//取最后一个参数
}
else
{
cout<<"请输入随机数bit位的长度n:";
cin>>input;
}
/*
cout<<"请输入随机数bit位的长度n:";
cin>>input;
*/
cout<<"取得的bit位长度n="<<input<<"的质数为:"<<createRndPrime(input)<<endl;
return 0;
}
/*
* 输入:一个长整数a
* 输出:返回1(为质数),返回0(非质数)
*
* */
int isPrime(long a)
{
long temp = (long)sqrt(a);
for (long i = 2; i <= temp; ++i)
{
if (0 == a % i)
return 0;
}
return 1;
}
/*
* 输入:随机数bit位的长度为n(解释:3bit位,则最大为111,最小为100;n bit位,则该数字二进制长度为n)
* 输出:返回该随机数
*
* */
long createRndInteger(int n)
{
srand(time(NULL)); //设置随机数种子
unsigned long first = pow(2,n-1); //可取的第一个随机数
unsigned long extent(first); //随机数取数范围右边界:extent
unsigned long ret = rand()%extent ; //随机数取数范围:0~extent
return ret + first; //输出结果=可取的第一个随机数+加上范围中取得的随机数
}
/*
* 输入:随机质数的bit位长度为n
* 输出:nbit位长度的质数
*
* */
long createRndPrime(int n)
{
long ret = 0;
while(!isPrime(ret = createRndInteger(n))){}
return ret;
}
(待续)