zoukankan      html  css  js  c++  java
  • 高精度加法(c++)

    为什么要用高精度?

    在这里插入图片描述
    有时我们要进行精度较高的运算时,就要使用高精度来进行运算;
    就如例题:

    大整数加法
    时间限制: 1000 ms 内存限制: 65536 KB
    提交数: 21965 通过数: 6345
    【题目描述】
    求两个不超过200位的非负整数的和。

    【输入】
    有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

    【输出】
    一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

    【输入样例】
    22222222222222222222
    33333333333333333333
    【输出样例】
    55555555555555555555

    两个200位的非负整数!就算以long long类型来进行计算也会溢出!
    建议:定义两个int类型的数组,数值的下标至少要200,然后用char类型的数组来读,读了再把读入的char数组转换成int类型,如下是代码实现:

    	int i,j,lena,lenb,x;
    	int a[205],b[205],c[105];
    	char t[205],t1[205];
    	scanf("%s %s",t,t1);
    	memset(a,0,sizeof(a));
    	memset(b,0,sizeof(b));
    	for(i=0;i<strlen(t);i++)a[strlen(t)-i]=t[i]-48; //将char类型的t数组转换成int类型的a数组,方法:减去0的ascii码值 
    	for(i=0;i<strlen(t1);i++)b[strlen(t1)-i]=t1[i]-48;
    

    切记!调用memset函数一定要加 #include<string.h>

    当然,你也可以加万能头文件 #include<bits/stdc++.h>
    但建议不要用万能头文件,数据多了可能会崩溃
    将数组读入处理后,就要计算,在此之前,要清空a数组和b数组;从末尾加起,每当a[i]+b[i]>9就要进位;如下是代码实现:

    	lena=strlen(t);
    	lenb=strlen(t1);
    	i=1;
    	while((i<=lena) or (i<=lenb)){
    		c[i]=a[i]+b[i]+x;
    		x=c[i]/10;
    		c[i]%=10;
    		i++;
    	}
    

    敲重点!!!
    不要忘记有前导0的存在!!!
    下面是我个人常用的一种方法(蒟蒻一枚):

    	bool f=false;
    	for(i=N-1;i>=1;i--){
    		if(a[i]!=0){
    			if(!f)f=true;
    			printf("%d",c[i]);
    		}
    		 else if(f)printf("%d",c[i]);
    	}
    	if(!f)printf("0");
    	printf("
    ");
    

    下面是完整的AC程序:

    #include<stdio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    const int N=205;
    int main(){
    	int i,j,lena,lenb,x=0;
    	int a[N+2],b[N+2],c[N+2];
    	char t[N+2],t1[N+2];
    	scanf("%s %s",t,t1);	
    	memset(a,0,sizeof(a));
    	memset(b,0,sizeof(b));
    	memset(c,0,sizeof(c));
    	for(i=0;i<strlen(t);i++)a[strlen(t)-i]=t[i]-48; //将char类型的t数组转换成int类型的a数组,方法:减去0的ascii码值 
    	for(i=0;i<strlen(t1);i++)b[strlen(t1)-i]=t1[i]-48;
    	lena=strlen(t);
    	lenb=strlen(t1);
    	i=1;
    	while((i<=lena) or (i<=lenb)){
    		c[i]=a[i]+b[i]+x;
    		x=c[i]/10;
    		c[i]%=10;
    		i++;
    	}
    	//printf("
    ");
    	c[i]=x;
    	bool f=false;
    	for(i=N-1;i>=1;i--){
    		if(c[i]!=0){
    			if(!f)f=true;
    			printf("%d",c[i]);
    		}
    		 else if(f)printf("%d",c[i]);
    	}
    	if(!f)printf("0");
    	printf("
    ");
    	return 0;
    }
    

    记得点个赞哦!
    Thank you for watching

  • 相关阅读:
    影响一个UIView是否能正常显示的几个因素
    浅谈多进程多线程的选择
    Spring阅读方法
    数据库范式通俗解释
    MySQL学习笔记(二):MySQL数据类型汇总及选择参考
    MySQL学习笔记(一):SQL基础
    存储过程优缺点
    MySQL学习笔记(三):常用函数
    bzoj 3576[Hnoi2014]江南乐 sg函数+分块预处理
    bzoj 3166 [Heoi2013]Alo 可持久化Trie
  • 原文地址:https://www.cnblogs.com/luojunhang/p/12300188.html
Copyright © 2011-2022 走看看