数论资料Word文档下载推荐.docx
《数论资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数论资料Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
j++)
a[j]=a[j]*i+c;
c=a[j]/10000;
a[j]=a[j]%10000;
}
if(c>
0){m++;
a[m]=c;
w=m*4+log10(a[m])+1;
printf("
\n%ld"
a[m]);
for(i=m-1;
i>
=0;
i--)printf("
%4.4ld"
a[i]);
returnw;
2.精度计算——乘法(大数乘小数)
mult(charc[],chart[],intm);
c[]:
被乘数,用字符串表示,位数不限
t[]:
结果,用字符串表示
m:
乘数,限定10以内
null
需要string.h
voidmult(charc[],chart[],intm)
inti,l,k,flag,add=0;
chars[100];
l=strlen(c);
for(i=0;
l;
s[l-i-1]=c[i]-'
0'
;
for(i=0;
k=s[i]*m+add;
if(k>
=10){s[i]=k%10;
add=k/10;
flag=1;
}else{s[i]=k;
flag=0;
add=0;
if(flag){l=i+1;
s[i]=add;
}elsel=i;
t[l-1-i]=s[i]+'
t[l]='
\0'
3.精度计算——乘法(大数乘大数)
mult(chara[],charb[],chars[]);
a[]:
b[]:
乘数,用字符串表示,位数不限
空间复杂度为o(n^2)
voidmult(chara[],charb[],chars[])
inti,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
charresult[65];
alen=strlen(a);
blen=strlen(b);
alen;
for(j=0;
blen;
j++)res[i][j]=(a[i]-'
)*(b[j]-'
);
for(i=alen-1;
i--)
for(j=blen-1;
j>
j--)sum=sum+res[i+blen-j-1][j];
result[k]=sum%10;
k=k+1;
sum=sum/10;
for(i=blen-2;
=i;
j++)sum=sum+res[i-j][j];
if(sum!
=0){result[k]=sum;
k;
i++)result[i]+='
for(i=k-1;
i--)s[i]=result[k-1-i];
s[k]='
while
(1)
if(strlen(s)!
=strlen(a)&
&
s[0]=='
)
strcpy(s,s+1);
else
break;
4.精度计算——加法
add(chara[],charb[],chars[]);
voidadd(chara[],charb[],charback[])
inti,j,k,up,x,y,z,l;
char*c;
if(strlen(a)>
strlen(b))l=strlen(a)+2;
elsel=strlen(b)+2;
c=(char*)malloc(l*sizeof(char));
i=strlen(a)-1;
j=strlen(b)-1;
k=0;
up=0;
while(i>
=0||j>
=0)
if(i<
0)x='
elsex=a[i];
if(j<
0)y='
elsey=b[j];
z=x-'
+y-'
if(up)z+=1;
if(z>
9){up=1;
z%=10;
}
elseup=0;
c[k++]=z+'
i--;
j--;
if(up)c[k++]='
1'
i=0;
c[k]='
for(k-=1;
k>
k--)
back[i++]=c[k];
back[i]='
5.精度计算——减法
sub(chars1[],chars2[],chart[]);
s1[]:
被减数,用字符串表示,位数不限
s2[]:
减数,用字符串表示,位数不限
默认s1>
=s2,程序未处理负数情况
voidsub(chars1[],chars2[],chart[])
inti,l2,l1,k;
l2=strlen(s2);
l1=strlen(s1);
t[l1]='
l1--;
for(i=l2-1;
i--,l1--)
if(s1[l1]-s2[i]>
=0)
t[l1]=s1[l1]-s2[i]+'
t[l1]=10+s1[l1]-s2[i]+'
s1[l1-1]=s1[l1-1]-1;
k=l1;
while(s1[k]<
0){s1[k]+=10;
s1[k-1]-=1;
k--;
while(l1>
=0){t[l1]=s1[l1];
loop:
if(t[0]=='
l1-1;
i++)t[i]=t[i+1];
t[l1-1]='
gotoloop;
if(strlen(t)==0){t[0]='
t[1]='
6.任意进制转换
conversion(chars1[],chars2[],longd1,longd2);
s[]:
原进制数字,用字符串表示
转换结果,用字符串表示
d1:
原进制数
d2:
需要转换到的进制数
高于9的位数用大写'
A'
~'
Z'
表示,2~16位进制通过验证
voidconversion(chars[],chars2[],longd1,longd2)
longi,j,t,num;
charc;
num=0;
s[i]!
='
if(s[i]<
9'
s[i]>
)t=s[i]-'
elset=s[i]-'
+10;
num=num*d1+t;
t=num%d2;
if(t<
=9)s2[i]=t+'
elses2[i]=t+'
-10;
num/=d2;
if(num==0)break;
i++;
i/2;
{c=s2[j];
s2[j]=s[i-j];
s2[i-j]=c;
s2[i+1]='
8.组合序列
m_of_n(intm,intn1,intm1,int*a,inthead)
组合数C的上参数
n1:
组合数C的下参数
m1:
组合数C的上参数,递归之用
*a:
1~n的整数序列数组
head:
头指针
*a需要自行产生
初始调用时,m=m1、head=0
调用例子:
求C(m,n)序列:
m_of_n(m,n,m,a,0);
voidm_of_n(intm,intn1,intm1,int*a,inthead)
inti,t;
if(m1<
0||m1>
n1)return;
if(m1==n1)
for(i=0;
m;
i++)cout<
<
a[i]<
'
'
//输出序列
cout<
\n'
return;
m_of_n(m,n1-1,m1,a,head);
//递归调用
t=a[head];
a[head]=a[n1-1+head];
a[n1-1+head]=t;
m_of_n(m,n1-1,m1-1,a,head+1);
//再次递归调用
素数表
//用素数表判定素数,先调用initprime
intplist[10000],pcount=0;
intprime(intn){
inti;
if((n!
=2&
!
(n%2))||(n!
=3&
(n%3))||(n!
=5&
(n%5))||(n!
=7&
(n%7)))
return0;
plist[i]*plist[i]<
if(!
(n%plist[i]))
return0;
returnn>
1;
voidinitprime(){
for(plist[pcount++]=2,i=3;
50000;
if(prime(i))
plist[pcount++]=i;
素数随机判定(miller_rabin)
//millerrabin
//判断自然数n是否为素数
//time越高失败概率越低,一般取10到50
#include<
stdlib.h>
#ifdefWIN32
typedef__int64i64;
#else
typedeflonglongi64;
#endif
intmodular_exponent(inta,intb,intn){//a^bmodn
intret;
for(;
b;
b>
>
=1,a=(int)((i64)a)*a%n)
if(b&
ret=(int)((i64)ret)*a%n;
//Carmichealnumber:
561,41041,825265,321197185
intmiller_rabin(intn,inttime=10){
if(n==1||(n!
while(time--)
if(modular_exponent(((rand()&
0x7fff<
16)+rand()&
0x7fff+rand()&
0x7fff)%(n-1)+1,n-1,n)!
=1)
return1;
矩阵乘法
1.void
Multiply
(int
a[100][100],
int
b[100][100],int
c[100][100])
2.
{
3.
i,
j,
4.
5.
for
(i
=
0;
i
row_a;
i++)
6.
7.
(j
j
column_b;
j++)
8.
9.
c[i][j]
10.
(k
k
column_a;
k++)
11.
12.
+=
a[i][k]
*
b[k][j];
13.
14.
15.
16.
}
N皇后问题
1.#include
stdio.h>
2.#include
math.h>
3.#include<
iostream>
4.using
namespace
std;
6.int
main()
7.{
n,temp=0;
cin>
n;
f[20];
if(n%6!
n%6!
=3)
{
if(n%2==0)
for(int
i=2;
i+=2)
f[temp++]=i;
17.
i=1;
=n-1;
18.
19.
20.
else
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
k=n/2;
34.
if(k%2==0)
35.
36.
i=k;
37.
38.
=k-2;
39.
40.
i=k+3;
41.
42.
=k+1;
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
k=(n-1)/2;
60.
61.
62.
63.
64.
65.
66.
=n-2;
67.
68.
69.
70.
f[temp++]=n;
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
i++)
88.
i+1<
"
f[i]<
endl;
89.
return
90.
91.}
大数幂模
1.#include<
2