- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
数论算法:
一.求两数的最大公约数
intgcd(inta,intb)
{
if(b==0)returna;
elsereturngcd(b,a%b);
}
二.分解质因数
voidfjzys(intn)//将质因数储存在a[]数组中不包括*
{longn,i,j=0;
a[j++]=1;
for(i=2;i=n;i++)
for(;n%i==0;n/=i)
a[j++]=i;
}
三.求质数表
#includefstream
usingnamespacestd;
boolh[50002]={false};
intmain(void)
{
h[0]=true;
h[1]=true;
h[2]=false;
intj;
ofstreamf1(z.txt);
for(inti=2;i50001;i++)
{
j=i+i;
if(!h[i])
{
while(j50001)
{
h[j]=true;
j+=i;
}
}
}
f1intprime={;
for(inti=0;i50001;i++)
{
if(!h[i])f1i,;
}
f1};;
}
高精度系列
零.通用:
intlc,x[100],y[100];
voidchartoint(chara[],charb[])//字符串数组转整型数组
{
intla=strlen(a),lb=strlen(b);
inti;
if(lalb)lc=la;
elselc=lb;
for(i=0;ila;i++)
x[la-i-1]=a[i]-48;
for(i=0;ilb;i++)
y[lb-i-1]=b[i]-48;
}
voidprint(intc[])//输出高精度计算结果稍微一改即可变为输出在数组中
{
for(inti=lc-1;i=0;i--)
coutc[i];
}
一.高精度加法:
voidgjjf(inta[],intb[],intc[])//a[]与b[]所记录的数相加得到c[]lc为ab最长位数
{
intm=0,i;
for(i=0;ilc;i++)
{
c[i]=(a[i]+b[i]+m)%10;
m=(a[i]+b[i]+m)/10;
}
if(m0)
c[lc++]=1;
}
二.高精度减法:
voidgj_f(inta[],intb[],intc[])//a,b已经倒置的被减数和减数数组c倒置输出结果lc为ab最长位数
{
inti;
for(i=0;ilc;i++)
{c[i]=c[i]+(a[i]-b[i]);
if(c[i]0)//借位问题
{c[i]=c[i]+10;
c[i+1]--;}
}
while(lc0c[lc-1]==0)lc--;
}
三.高精度乘法:
①.高精度乘低精度
voidgjcdj(inta[],intb,intc[])//a为高精度数,b为单精度,c为计算结果的倒置,!转化函数不再适用
{
inti,j;
for(i=0;i=lc;i++)c[i]=a[i]*b;
for(j=0;jlc||a[j]10;j++)
{c[j+1]=c[j+1]+c[j]/10;
c[j]=c[j]%10;
}
while(c[lc-1]==0lc0)lc--;
}
②.高精度阶乘(引申)
voidgjdjc(intn,intc[])//求n!c数组倒置储存结果lc初始值为0
{inti,j;//循环计数变量
c[0]=1;
for(i=2;i=n;i++,lc=j)//算阶乘
{
for(j
文档评论(0)