由于提高组不考
F
F
T
FFT
FFT与多项式求逆,故此处不给
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)的高精乘和高精除。
1.高精加
#include<bits/stdc++.h>
using namespace std
;
int Read(){
int x
=0,f
=1;char ch
=getchar();
while(!isdigit(ch
)){if(ch
=='-') f
=-1;ch
=getchar();}
while(isdigit(ch
)){x
=(x
<<3)+(x
<<1)+ch
-'0';ch
=getchar();}
return x
*f
;
}
char s1
[205],s2
[205];
int a
[205],b
[205],c
[205],x
=0;
int main(){
scanf("%s%s",s1
,s2
);
int n
=strlen(s1
),m
=strlen(s2
);
for(int i
=0;i
<n
;i
++) a
[n
-i
]=s1
[i
]-'0';
for(int i
=0;i
<m
;i
++) b
[m
-i
]=s2
[i
]-'0';
if(n
<m
) n
=m
;
for(int i
=1;i
<=n
;i
++){
x
=a
[i
]+b
[i
]+x
;
c
[i
]=x
%10;
x
=x
/10;
}
if(x
>0) c
[++n
]=x
;
for(int i
=n
;i
>=1;i
--) cout
<<c
[i
];
return 0;
}
2.高精减
#include<bits/stdc++.h>
using namespace std
;
int Read(){
int x
=0,f
=1;char ch
=getchar();
while(!isdigit(ch
)){if(ch
=='-') f
=-1;ch
=getchar();}
while(isdigit(ch
)){x
=(x
<<3)+(x
<<1)+ch
-'0';ch
=getchar();}
return x
*f
;
}
char s1
[205],s2
[205];
int a
[205],b
[205],c
[205];
int main(){
scanf("%s%s",s1
,s2
);
int n
=strlen(s1
),m
=strlen(s2
);
for(int i
=0;i
<n
;i
++) a
[n
-i
]=s1
[i
]-'0';
for(int i
=0;i
<m
;i
++) b
[m
-i
]=s2
[i
]-'0';
if(n
<m
||n
==m
&&strcmp(s1
,s2
)<0){
printf("-");
for(int i
=1;i
<=m
;i
++) swap(a
[i
],b
[i
]);
swap(n
,m
);
}
for(int i
=1;i
<=n
;i
++){
int x
=10+a
[i
]-b
[i
];
c
[i
]=x
%10;
a
[i
+1]=a
[i
+1]+x
/10-1;
}
while(n
>1&&c
[n
]==0) n
--;
for(int i
=n
;i
>=1;i
--) cout
<<c
[i
];
return 0;
}
3.高精乘(
O
(
n
2
)
O(n^2)
O(n2))
#include<bits/stdc++.h>
using namespace std
;
int Read(){
int x
=0,f
=1;char ch
=getchar();
while(!isdigit(ch
)){if(ch
=='-') f
=-1;ch
=getchar();}
while(isdigit(ch
)){x
=(x
<<3)+(x
<<1)+ch
-'0';ch
=getchar();}
return x
*f
;
}
char s1
[205],s2
[205];
int a
[205],b
[205],c
[505];
int main(){
scanf("%s%s",s1
,s2
);
int n
=strlen(s1
),m
=strlen(s2
);
for(int i
=0;i
<n
;i
++) a
[n
-i
]=s1
[i
]-'0';
for(int i
=0;i
<m
;i
++) b
[m
-i
]=s2
[i
]-'0';
for(int i
=1;i
<=n
;i
++){
int x
=0;
for(int j
=1;j
<=m
;j
++){
x
=x
+a
[i
]*b
[j
]+c
[i
+j
-1];
c
[i
+j
-1]=x
%10;
x
=x
/10;
}
c
[i
+m
]=c
[i
+m
]+x
;
}
int len
=n
+m
;
while(len
>1&&c
[len
]==0) len
--;
for(int i
=len
;i
>=1;i
--) cout
<<c
[i
];
return 0;
}
4.高精除低精
#include<bits/stdc++.h>
using namespace std
;
int Read(){
int x
=0,f
=1;char ch
=getchar();
while(!isdigit(ch
)){if(ch
=='-') f
=-1;ch
=getchar();}
while(isdigit(ch
)){x
=(x
<<3)+(x
<<1)+ch
-'0';ch
=getchar();}
return x
*f
;
}
char s1
[205];
int a
[205],b
,c
[205];
int main(){
scanf("%s",s1
);
b
=Read();
int n
=strlen(s1
);
for(int i
=0;i
<n
;i
++) a
[i
]=s1
[i
]-'0';
int x
=0;
for(int i
=0;i
<n
;i
++){
c
[i
]=(x
*10+a
[i
])/b
;
x
=(x
*10+a
[i
])%b
;
}
int pos
=1;
while(c
[pos
]==0&&(pos
<n
-1)) pos
++;
for(int i
=pos
;i
<n
;i
++) cout
<<c
[i
];
cout
<<endl
<<x
;
return 0;
}
5.高精除高精(
O
(
n
2
)
O(n^2)
O(n2))
#include<bits/stdc++.h>
using namespace std
;
int Read(){
int x
=0,f
=1;char ch
=getchar();
while(!isdigit(ch
)){if(ch
=='-') f
=-1;ch
=getchar();}
while(isdigit(ch
)){x
=(x
<<3)+(x
<<1)+ch
-'0';ch
=getchar();}
return x
*f
;
}
char s1
[205],s2
[205];
int a
[205],b
[205],c
[205],hi
,n
,m
;
bool comp(int lw
){
if(hi
-lw
>m
) return true;
if(hi
-lw
<m
) return false;
int tmp
=m
;
while(tmp
>0&&a
[lw
+tmp
]==b
[tmp
]) tmp
--;
if(tmp
==0) return true;
if(a
[lw
+tmp
]>b
[tmp
]) return true;
return false;
}
void highminus(int lw
){
int x
=0;
for(int i
=1;i
<=m
;i
++){
x
=10+a
[lw
+i
]-b
[i
];
a
[lw
+i
]=x
%10;
a
[lw
+i
+1]=a
[lw
+i
+1]-1+x
/10;
}
while(hi
>lw
&&a
[hi
]==0) hi
--;
}
int main(){
scanf("%s%s",s1
,s2
);
n
=strlen(s1
),m
=strlen(s2
);
for(int i
=0;i
<n
;i
++) a
[n
-i
]=s1
[i
]-'0';
for(int i
=0;i
<m
;i
++) b
[m
-i
]=s2
[i
]-'0';
hi
=n
;
for(int i
=n
;i
>0;i
--){
while(comp(i
-1)){
c
[i
]++;
highminus(i
-1);
}
}
while(n
>0&&c
[n
]==0) n
--;
for(int i
=n
;i
>0;i
--) cout
<<c
[i
];
cout
<<endl
;
while(m
>0&&a
[m
]==0) m
--;
for(int i
=m
;i
>0;i
--) cout
<<a
[i
];
return 0;
}
转载请注明原文地址: https://mac.8miu.com/read-495411.html