麻烦的 高精度
高精其实就是因为c++不行事,数太大它算不了,这时候就出现了高精!!!
高精其实就是把大数存在一个大数组里,通过数组各位的神奇运算,最后得到结果。其实本质就是竖式(超小声)
高精度通用:
先用字符型数组输入,再存到int型数组里;
char a1[1005], b1[1005];
int a[1005], b[1005], c[40010];
gets(a1);
gets(b1);
lena = strlen(a1);
lenb = strlen(b1);
for (int i = 0; i <= lena - 1; i++) {
a[lena - i] = a1[i] - '0';
}
for (int i = 0; i <= lenb - 1; i++) {
b[lenb - i] = b1[i] - '0';
}
1.高精度乘法
char a1[1005], b1[1005];
int a[1005], b[1005], c[40010], x, lena, lenb, lenc;
int main() {
gets(a1);
gets(b1);
lena = strlen(a1);
lenb = strlen(b1);
for (int i = 0; i <= lena - 1; i++) {
a[lena - i] = a1[i] - '0';
}
for (int i = 0; i <= lenb - 1; i++) {
b[lenb - i] = b1[i] - '0';
}//存入
for (int i = 1; i <= lena; i++) {
x = 0;
for (int j = 1; j <= lenb; j++) {
c[i + j - 1] = a[i] * b[j] + x + c[i + j - 1];//主体程序存乘法后的结果
x = c[i + j - 1] / 10;
c[i + j - 1] %= 10;
}
c[i + lenb] = x;//判断进位
}
lenc = lena + lenb;
while (c[lenc] == 0 && lenc > 1) {//去除先导0
lenc--;
}
for (int i = lenc; i >= 1; i--) {
printf("%d", c[i]);//倒序!输出要倒序
}
return 0;
}
2.高精度阶乘
int main(){
int n,k;
scanf("%d",&n);
int a[1000] = {0};
for(int i = 2;i <= n;i ++){
for(int j = 1;j <= 1000;j ++){
a[j] = a[j] * i;//a[j]累乘,得阶乘结果
if(a[j - 1] >= 10){//检查有没有进位
a[j] += a[j - 1] / 10;
a[j - 1] %= 10;
}
}
}
for(int j = 1000;j >= 1;j --){//去掉前面的0
if(a[j] != 0){//eg.0321变为321
k = j;
break;
}
}
for(int j = k;j >= 1;j --){
printf("%d",a[j]);//倒序输出结果
}
return 0;
}
3.高精度取模
int mod(int b,string a){//高精度a除以单精度b
int d=0;
for(int i=0;i<a.size();i++) d=(d*10+(a[i]-'0'))%b; //求出余数
return d;
}
int main(){
string a;
int b;
while(cin>>a>>b){
cout<<mod(b,a)<<endl;
}
return 0;
}
4.高精度(类似)除法:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n,m,i;
cin>>n>>m;
printf("%d/%d=%d.",n,m,n / m);//输出整数部分
n %= m;
for(i = 1;i <= 20;i ++){
n *= 10;
printf("%d",n / m);//小数部分
n %= m;
if (n == 0) break;
}
printf("\n");
return 0;
}
THE END.