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

  • 相关阅读:
    java实现冒泡排序
    使用telnet测试指定端口的连通性
    聊聊Java中的异常及处理
    Java工具类——数学相关的类
    谈谈javaSE中的==和equals的联系与区别
    如何在Vim中更改颜色和主题
    配置类为什么要添加@Configuration注解呢?
    你知道Spring是怎么解析配置类的吗?
    读源码,我们可以从第一行读起
    Spring杂谈 | Spring中的AutowireCandidateResolver
  • 原文地址:https://www.cnblogs.com/luojunhang/p/12300188.html
Copyright © 2011-2022 走看看