高精度加法运算
知识目标
学习高精度数加法运算;
没有进位的高精度数的加法运算
高精度数的加法运算(一)
【问题描述】:
输入两个高精度数,输出这两个数的和(两个高精度数位数相同且没有进位)。
【样例输入 1】2222222222
3333333333
【样例输出 1】5555555555
【样例输入 2】111222333444555
555444333222111
【样例输出 2】666666666666666
【过程分析】
对此类型的题我们总结方法如下:
两个高精度数位数相同且没有进位的加法:对应位相加。
第一步:定义两个字符型数组 a1,b1 用来存储进行相加的两个高精度数,定义两个整型数组 a,b 分别用来存储高精度数的数字,定义整型变量 len 表示相加的两个数的位数,定义整型变 量 sum 表示每个数位上的数相加的和,赋初始值为 0;
char a1[1001]={},b1[1001]={};
int a[1001]={},b[1001]={},len,sum = 0;
cin>>a1>>b1;
len = strlen(a1);
整型数组里;
for(int i = 0;i <= len-1;i++){
a[i] = a1[i] - 48;
b[i] = b1[i] - 48;
}
for(int i = 0;i <=len-1;i++){
sum = a[i] +b[i];
cout << sum;
}
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char a1[1001]={},b1[1001]={};
int a[1001]={},b[1001]={},len;
cin>>a1>>b1;
len = strlen(a1);
for(int i = 0;i <= len-1;i++){
a[i] = a1[i] - 48;
b[i] = b1[i] - 48;
}
int sum = 0;
for(int i = 0;i <=len-1;i++){
sum = a[i] +b[i];
cout << sum;
}
return 0;
}
高精度数的加法运算(二)
【问题描述】
输入两个高精度数,输出这两个数的和(两个高精度数位数不相同且没有进位)。
【样例输入 1】1234522222
54321
【样例输出 1】1234576543
【样例输入 2】111222333444555
999555444333222111
【样例输出 2】999666666666666666
【过程分析】
对此类型的题我们总结方法如下:
两个高精度数数位数不相同且没有进位的加法:倒序补 0,对应位相加,去前导 0,倒序输出。
第一步:定义两个字符型数组 a1,b1 用来存储进行相加的两个高精度数,定义整型数组a,b, c 分别用来存储两个高精度数的数字和相加后得到的数字,定义整型变量 lena,lenb 分别表示相 加的两个数的位数,定义整型变量 i,lenc 表示循环变量,两个高精度数相加后的数的位数长度,对lenc 赋初始值为 0;
char a1[1001]= {},b1[1001]= {};
int a[1001]= {},b[1001]= {},c[1001]= {},lena,lenb,i;
int lenc = 0;
第二步:输入两个高精度数,并分别求出两个高精度数的长度;
cin>>a1>>b1;
lena = strlen(a1);
lenb = strlen(b1);
第三步:使用 for 循环遍历,分别将存储在字符数组里的被加数和加数字符串转换为数字, 并倒序储存到整型数组里;
for(i = 0; i <= lena-1; i++) {
a[lena-i-1] = a1[i] - 48;
}
for(i = 0; i <= lenb -1; i++) {
b[lenb-i-1] = b1[i] - 48;
}
第四步:使用 while 循环语句对各个数位上的数求和,满足相加得到的位数小于 a 的长度或者 b 的长度时,执行循环语句;
while(lenc <lena || lenc < lenb) {
c[lenc] = a[lenc]+b[lenc]; lenc++;
}
第五步:使用 for 循环语句去掉前导的 0;
for(i = lenc-1; i >=0; i--) {
if(c[i] != 0) {
break;
}
}
第六步:使用 for 循环语句进行倒序输出各个数位上的数即为最后的正确结果,因为位数的由键盘输入来确定的,因此 for 循环语句当中循环变量的初始值设置为空。
for( ; i >=0; i--){
cout << c[i];
}
完整代码:
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char a1[1001]= {},b1[1001]= {};
int a[1001]= {},b[1001]= {},c[1001]= {};
int lena,lenb,i,lenc = 0; cin >> a1 >> b1;
lena = strlen(a1); lenb = strlen(b1);
for(i = 0; i <= lena-1; i++) {
a[lena-i-1] = a1[i] - 48;
}
for(i = 0; i <= lenb -1; i++) {
b[lenb-i-1] = b1[i] - 48;
}
while(lenc <lena || lenc < lenb) {
c[lenc] = a[lenc]+b[lenc]; lenc++;
}
for(i = lenc-1; i >=0; i--) {
if(c[i] != 0) {
break;
}
}
for( ; i >=0; i--){
cout << c[i];
}
return 0;
}
高精度的首末位和:
【问题描述】输入一个高精度数,倒序存储,输出它的第一位和最后一位的和。
【输入样例】
123123123123123423423411111
【输出样例】
2
【过程分析】
第一步:定义一个字符型数组 a1 用来存储高精度数,定义一个整型数组 a 用来存储高精度数的数字;
char a1[1001]={};
int a[1001]={};
第二步:输入一个高精度数,并计算位数赋值给 len;
cin >> a1 ;
int len = strlen(a1);
第三步:使用 for 循环遍历,将存储在字符数组高精度数转换为数字,并倒序储存到整型数组里;
for (int i=0;i<len;i++){
a[len-i-1]=a1[i]-48;
}
第四步:输出整型数组 a 第一个数和最后一个数的和;
cout << a[0]+a[len-1];
完整代码:
#include <iostream>
#include <cstring>
using namespace std;
int main (){
char a1[1001]={};
int a[1001]={};
cin >> a1;
int len = strlen(a1);
for (int i=0;i<len;i++){
a[len-i-1]=a1[i]-48;
}
cout << a[0]+a[len-1]; return 0;
}
高精度数的相反数:
【问题描述】输入一个高精度数,输出它的相反数
【输入样例】-1234567812345671234567
【输出样例】1234567812345671234567
【输入样例】12345876549876598769876590876
【输出样例】-12345876549876987659876590876
【过程分析】
第一步:定义一个字符型数组 a1 用来存储高精度数,定义一个整型数组 a 用来存储高精度数的数字;
char a1[1001]={};
int a[1001]={};
第二步:输入一个高精度数,并计算位数赋值给 len,声明变量 aa 并赋值为 1 表示字符数组 a1 第一位非减号;
cin >>a1;
int aa=1,len = strlen(a1);
第三步:使用 if else 语句判断,当字符数组 a1 第一个元素为‘-’时,aa 重新赋值为2,并使用 for 循环,将字符数组 a1 中元素向前移,首位‘-’去掉,当条件不成立时,输出‘-’;
if (a1[0]=='-'){
aa=2;
for(int i=0;i<=len-1;i++){
a1[i]=a1[i+1];
}
}else{
cout << '-';
}
第四步:使用 for 循环遍历,将存储在字符数组高精度数转换为数字,并储存到整型数组里并输出;
for (int i=0;i<=len-aa;i++){
a[i] = a1[i] - 48;
cout << a[i];
}
完整代码:
#include <iostream>
#include <cstring>
using namespace std;
int main (){
char a1[1001]={};
int a[1001]={};
cin >> a1;
int aa=1,len = strlen(a1);
if (a1[0]=='-'){
aa=2;
for(int i=0;i<=len-1;i++){
a1[i]=a1[i+1];
}
}else{
cout << '-';
}
for (int i=0;i<=len-aa;i++){
a[i] = a1[i] - 48;
cout << a[i];
}
return 0;
}
【问题描述】
输入两个高精度数,交换他们的个位数并输出。
【样例输入】
123123421342342345234777777
11111
【样例输出】
123123421342342345234777771
11117
解题思路:
-
- 声明两个字符数组存储大精度数
- 转换为数字逆序存储在整型数组中
- swap 函数交换两个整型数组中第一位元素的值
- 输出两个数组的值
完整代码:
#include <iostream>
#include <cstring>
using namespace std;
int main (){
char a1[1001]={},b1[1001]={};
int a[1001]={},b[1001]={};
cin >> a1 >> b1;
int lena = strlen(a1); int lenb = strlen(b1);
for (int i=0;i<lena;i++){ //逆序存储
a[lena-1-i]=a1[i]-48;
}
for (int i=0;i<lenb;i++){ //逆序存储
b[lenb-1-i]=b1[i]-48;
}
swap(b[0],a[0]); //交换两个数的个位数
for(int i =lena-1;i>=0;i--){
cout<<a[i];
}
cout<<endl;
for(int i =lenb-1;i>=0;i--){
cout<<b[i];
}
return 0;
}