C++ 高精度 加减

231 阅读2分钟

刷题OJ 网站!验证你的代码是否正确!!!

一、高精度加法

思想:

  1. 把大数存到字符串;
  2. 字符串的每个字符数字都通过ASCII转换存到数组,
  3. 注意的是要低位存在数组开头:a[i] = s[len-i-1]-‘0’;
  4. 获取最大的数长度:max(len1,len2) ;
  5. 加法进位的算式:
  6. ① a[i+1] += a[i]/10;
  7. ② a[i] %= 10;
  8. 数字溢出,长度+1;
  9. 反向输出结果;

代码实现

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[10000],b[10000],c[100001];
int main(){
//	1.输入值,长度 
	cin>>s1>>s2;  
	int len1 = s1.size();
	int len2 = s2.size(); 
//	2.把字符转为整数存到数组
//  注意要个位存到数组开头 
	for(int i=0;i<len1;i++)   a[i] = s1[len1-i-1]-'0';
	for(int i=0;i<len2;i++)   b[i] = s2[len2-i-1]-'0';
//	3.获取最大的数。 
	int len = max(len1,len2);
	// 对各个位数进行相加 
	for(int i=0;i<len;i++)   c[i]=a[i]+b[i];
	//4.进位
	for(int i=0;i<len;i++){
		c[i+1] += c[i]/10;
		c[i] %= 10; 
	}
	//5.溢出
	while(c[len]==0 && len>0){
		len--;
	} 
	if(c[len]>0)   len++;
	//6.反向输出 
	for(int i=len-1;i>=0;i--)   cout<<c[i];
	return 0;
} 

二、高精度减法

减法是这样要求的,当两数相减<0,要输出带负  ‘-’ 号!

思想:

  1. 输入大数;
  2. 判断大小,固定s1恒大于s2:
 if(s1.size()<s2.size() || s1.size()==s2.size() && s1<s2){
 	swap(s1,s2); //交换值
 	cout<<"-";
	} 
  1. 获取长度;
  2. 字符变整数:a[i] = s1[len1-i-1]-'0';
  3. 减法运算:
  if(a[i]<b[i]){
	a[i+1]--; //上位-- 
	a[i]+=10; // 本位+10 
    }
  c[i] = a[i]-b[i]; 
  1. 去除前导零;
  2. 反向输出;

代码实现

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[10000],b[10000],c[10000];
int main(){
//	1.输入值
	cin>>s1>>s2;
//	2.判断大小,固定s1恒大于s2 
	if(s1.size()<s2.size() || s1.size()==s2.size() && s1<s2){
		swap(s1,s2); //交换值
		cout<<"-";
	} 
//	3.获取长度
	int len1 = s1.size(); 
	int len2 = s2.size();  
//	4.字符变整数
	for(int i=0;i<len1;i++){   a[i] = s1[len1-i-1]-'0';
	for(int i=0;i<len2;i++){   b[i] = s2[len2-i-1]-'0';
	//5.减法运算 
	for(int i=0;i<len1;i++){
		if(a[i]<b[i]){
			a[i+1]--; //上位-- 
			a[i]+=10; // 本位+10 
		}
		c[i] = a[i]-b[i]; 
	} 
	//6去除前导零
	while(c[len1-1]==0 && len1>1){
		len1--;
	} 
	//7.反向输出
	for(int i=len1-1;i>=0;i--)   cout<<c[i];
	return 0;
} 

刷题OJ 网站!验证你的代码是否正确!!!