- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法分析与设计实验七
2012级计算机科学与技术专业 姓名 牛立峰 学号 201215203
实验题目
编写拉斯维加斯整数因子分解算法和八皇后算法
实验目的
通过上机实验,了解并掌握概率算法思想
源代码
整数因子分解:
//随机化算法 拉斯维加斯算法 因子分割问题
//#include stdafx.h
//#include RandomNumber.h
#include iostream
using namespace std;
#includetime.h
#includemath.h
//随机数类
const unsigned long maxshort = 65536L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
class RandomNumber
{
private:
//当前种子
unsigned long randSeed;
public:
RandomNumber(unsigned long s = 0);//构造函数,默认值0表示由系统自动产生种子
unsigned short Random(unsigned long n);//产生0:n-1之间的随机整数
double fRandom(void);//产生[0,1)之间的随机实数
};
RandomNumber::RandomNumber(unsigned long s)//产生种子
{
if(s == 0)
{
randSeed = time(0);//用系统时间产生种子
}
else
{
randSeed = s;//由用户提供种子
}
}
unsigned short RandomNumber::Random(unsigned long n)//产生0:n-1之间的随机整数
{
randSeed = multiplier * randSeed + adder;//线性同余式
return (unsigned short)((randSeed16)%n);
}
double RandomNumber::fRandom(void)//产生[0,1)之间的随机实数
{
return Random(maxshort)/double(maxshort);
}
int Split(int n)
{
int m = floor(sqrt(double(n)));
for (int i=2; i=m; i++)
{
if (n%i==0)
{
return i;
}
}
return 1;
}
//求整数a和b最大公因数的欧几里得算法
int gcd(int a,int b)
{
if(b==0)
{
return a;
}
else
{
return gcd(b,a%b);
}
}
//求整数n因子分割的拉斯维加斯算法
void Pollard(int n)
{
RandomNumber rnd;
int i = 1;
int x = rnd.Random(n); //随机整数
int y = x;
int k = 2;
while(true)
{
i++;
x = (x*x - 1) % n; //x[i]=(x[i-1]^2-1) mod n
int d = gcd(y-x,n); //求n的非平凡因子
if((d1) (dn))
{
coutdendl;//因子分割问题:求n的[一]个非平凡因子的问题
return;
}
if(i == k)
{
y = x;
k *= 2;
}
}
}
int main()
{
int n = 1024;
coutn的非平凡因子:endl;
Pollard(n);
return 0;
}
八皇后问题:
#includestdio.h
const int num = 8;/*可以随意修改,num是多少解的就是几皇后问题*/
int arr[num];
int count =0;
void display()/*一个简单的数组输出函数,顺便统计解的个数*/
{
for(int i=0; inum; ++i)
printf(%d\t,arr[i]);
printf(\n);
count++;
}
void queens(int pos=0)
文档评论(0)