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;
}