高精度

麻烦的 高精度

高精其实就是因为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.

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值