07-11 C++系列-高精度加法

高精度数

认识高精度数

高精度数:俗称“大数”,在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字,一般这类数字我们统称为高精度数。

高精度数的存储

高精度数由于位数太长导致无法在计算机中正常存储,于是,我们将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中,用一个数组去表示一个数字。

例如: char a[20]=[“1234567890123456789”]; 在这里插入图片描述

  • 高精度数的存储一般采用数组的形式存储。
  • 为了控制高精度数的每一位数字在数组中存储时只占一个位置,我们采用char类型的数组来存储高精度数。
  • 而使用char数组存储的高精度数,在后续的计算过程中,需要将char类型的数字字符转换成int类型的数字之后再进行计算。

存储过程

在这里插入图片描述

ASCII码表

在这里插入图片描述

【代码示例】

//定义 char 数组用以存储数据
char a[1001]={};
//定义 int 数组,用以存储转换后的数组
int a1[1001]={};
//输入高精度数
cin>>a;
//求出大数的长度
int lena=strlen(a);
for(int i=0;i<lena;i++){
      //将 char 型字符转换为 int 数字
      a1[i]=a[i]-48;
      //输出大数
      cout<<a1[i];
}

输出大数

【问题描述】
定义一个高精度数a,将这个数输入后转换为数值类型并输出。a的长度不超过 1000。
输入:一个高精度数a
输出:处理后的高精度数a
【样例输入】
12234444555666777
【样例输出】
12234444555666777

【代码示例】


#include<iostream>
#include<cstring>
using namespace std;
int main(){
	char a[1001] = {};
	int a1[1001] = {};
	cin >> a;
	int lena = strlen(a);
	//char型转换成int型 
	for(int i=0; i<lena; i++){
		a1[i] = a[i]-48;
		cout << a[i];
	}
	return 0;
}

求大数的首末位

【问题描述】
输入一个长度不超过1000的高精度数 a,求出这个大数的长度以及首末位并输出。
输入:一行,表示这个高精度数 a。
输出:一行,有三个数,以空格分开。分别表示 a 的长度,首位数字以及末位数字。
【样例输入】
1231231231246534646536
【样例输出】
22 1 6

【代码示例】

#include <iostream>
#include <cstring>
using namespace std;
int main(){
      char a[1001]={};
      cin>>a;
      int lena=strlen(a);
      cout<<lena<<“ ”<<a[0]<<‘ ’<<a[lena-1];
      return 0;
}

倒序输出

【问题描述】
定义一个高精度数 a,将这个数输入后转换为数值类型后倒序输出。a的长度不超过 1000,末尾为0时不做处理。
输入:一个高精度数 a
输出:倒序的高精度数a
【样例输入】
12234444555666777
【样例输出】
77766655544443221

【代码示例】

#include <iostream>
#include <cstring>
using namespace std;
int main(){
      char a[1001]={};
      int a1[1001]={};
      cin>>a; 
      int lena=strlen(a);
      for(int i=0;i<lena;i++){
            a1[i]=a[i]-48;
      }
      for(int i=lena-1;i>=0;i--){
        cout<<a1[i];
      }
//      第二种方法:
//      for(int i=0;i<lena;i++){
//        cout<<a1[lena-1-i];
//      }
      return 0;
}

高精度数算法

高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算的方法。

位数相同且无进位

在这里插入图片描述
总结:转换为int型之后,对应位直接进行相加即可。

【代码示例】

char a[1001]={},b[1001]={};
//c1 用以存储相加后的和
int a1[1001]={},b1[1001]={},c1[1001]={};
cin>>a>>b;
int len=strlen(a);
for(int i=0;i<len;i++){
      a1[i]=a[i]-48;
      b1[i]=b[i]-48;
      //处理之后进行相加
      c1[i]=a1[i]+b1[i];
}
//输出相加和
for(int i=0;i<len;i++)
      cout<<c1[i];

位数不一定相同且无进位

注意:此时需要先将对应位对齐,再进行计算!

在这里插入图片描述
在这里插入图片描述

注意:两数之和的位数应该与两个加数中较长的一个位数相同!

【代码示例】

int lena=strlen(a),lenb=strlen(b);
int len=(lena>lenb?lena:lenb);
//将两个加数逆序转换为 int 型数字
for(int i=0;i<lena;i++)
      a1[i]=a[lena-1-i]-48;
for(int i=;i<lenb;i++)
      b1[i]=b[lenb-1-i]-48;
//将对应位进行相加
for(int i=0;i<len;i++)
      c1[i]=b1[i]+a1[i];
//将相加和倒序输出
for(int i=0;i<len;i++)
      cout<<c1[len-1-i];

高精度数加法实例一

【问题描述】
有两个高精度数a,b位数相同,并且a和b的每一位数都在0-4 之间,请编程求出a与b之和。
输入:两行,第一行为a,第二行为 b。
输出:一行,表示a与b之和 c。
【样例输入】
232323232323
111111111111
【样例输出】
343434343434

【代码示例】

#include <iostream>
#include <cstring>
using namespace std;
int main(){
      char a[1001]={},b[1001]={};
      int a1[1001]={},b1[1001]={},c1[1001]={};
      cin>>a>>b; 
      int lena=strlen(a);
      for(int i=0;i<lena;i++){
            a1[i]=a[i]-48;
            b1[i]=b[i]-48;
            c1[i]=a1[i]+b1[i];
}
      //正序输出结果
      for(int i=0; i<lena; i++){
            cout<<c1[i];
       }
       return 0;
}

高精度数加法实例二

【问题描述】
有两个高精度数a,b,a和b的每一位数都在0-4 之间,请编程求出a与b之和。
输入:两行,第一行为a,第二行为 b。
输出:一行,表示a与b之和 c。
注意:a与b的位数不一定相同
【样例输入】
123123123123
32413241
【样例输出】
123155536364

【代码示例】

#include <iostream>
#include <cstring>
using namespace std;
int main(){
      char a[1001]={},b[1001]={};
      int a1[1001]={},b1[1001]={},c1[1001]={};
      cin>>a>>b; 
      int lena=strlen(a),lenb=strlen(b);
      int len=(lena>lenb?lena:lenb);           
      for(int i=0;i<lena;i++){
            a1[i]=a[lena-1-i]-48;
}
for(int i=0;i<lenb;i++){
      b1[i]=b[lenb-1-i]-48;
}
for(int i=0;i<len;i++){
      c1[i]=b1[i]+a1[i];
}
      //正序输出结果
      for(int i=0; i<len; i++){
            cout<<c1[len-1-i];
       }
       return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KK的号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值