第三章,课外作业(C++,数字高精度之加法)

昨天无意中去了smartoj(一个OJ题的网站),第一题是输入两个数,然后输出和,觉得很简单,然后就开始做第二题,(题目地址)没想到是这一题是数字高精度的加法,以前学java是也没考虑过这种题目,于是去网上看了看,没有看懂别人写的,但思路倒是了解了,用字符串和数组结合来做,于是有了下面的代码,写的很乱,但还是通过了smartoj的测试。我的思路说起来很简单,如下:

1.先用两个字符串接收

2.获取两个数字串的长度

3.把两个字符串每个数字截取下来存在数组中(两个数组的长度都是最长那个字符串长度+1)

4.然后用一个新数组(长度和前两个数组一样)来存两个数组的相加的和

5.遍历数组,输出数字

题目截图:



我的解答方法:

#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h> 
using namespace std;
int main(int argc, char** argv) {
	//定义两个字符串,用来存输入的数字 
	string str01,str02,str03,str04 ;
	
	//定义四个整数,前三个用来定义数组的长度,最后一个用来获取两个数值的长度差 
	int num01,num02,num03,num04;
	
	//接收输入的两个数 
	cin>>str01>>str02;
	
	
	//获取两个数的长度 
	num01 = str01.size();
	num02 = str02.size();
	
	//----------------------去掉数字串前面的0--start-------------------- 
	//定义一个交换数 n 
	int n =0;
	//去掉第一个数字串前面的 0 
	for(int i=0;i<num01;i++){
		//获取每个字符转成数字(既将字符串1转成数字1) 
		//str01.substr(i,1);为截取字符串,从第i个开始,截取1个
		//str01.substr(i,1).c_str(); 将截取的字符串转为char
		//atoi();将char转为数字 
		n=atoi(str01.substr(i,1).c_str());
		if(n==0){
			if(i==(num01-1)){
				str01=str03;
				break;
			}
			str03=str01.substr(i+1,num01-1-i);
				
		}else{
			if(i==0){
				break;
			}
			str01=str03;
			break;
		}
		
	} 
	
	//去掉第二个数字串前面的 0
	for(int i=0;i<num02;i++){
		n=atoi(str02.substr(i,1).c_str());
		if(n==0){
			if(i==(num01-1)){
				str02=str04;
				break;
			}
			str04=str02.substr(i+1,num02-1-i);
				
		}else{
			if(i==0){
				break;
			}
			str02=str04;
			break;
		}
		
	} 
	
	//----------------------去掉数字串前面的0--end-------------------- 
	
	//再次获取长度 
	num01 = str01.size();
	num02 = str02.size();
	
	
	//算出第三个数组的长度 
	if(num01>num02) {
		num03=num01+1;
	}else{
		num03=num02+1;
	}
	
	//输入的两个数的长度的差值
	num04 = num01-num02;
	if(num04>0) num04=num04;
	else num04 = -num04; 
	
	
	//----------------------初始化数组--start-------------------- 
	//初始化数组,定义长度 ,都定义成两个数最长的那个数的长度+1 
	int arr01[num03];
	int arr02[num03]; 
	int arr03[num03];
	
	for(int i=0;i<num03;i++){
		//初始化数组一 
		if(num01>=num02&&i>0){
			arr01[i]=atoi(str01.substr(i-1,1).c_str()); 
		}else if(num01<num02&&i>num04){
			arr01[i]=atoi(str01.substr(i-num04-1,1).c_str()); 
		}else{
			arr01[i]=0;
		}
		
		//初始化数组二 
		if(num02>=num01&&i>0){
			arr02[i]=atoi(str02.substr(i-1,1).c_str()); 
		}else if(num02<num01&&i>num04){
			arr02[i]=atoi(str02.substr(i-num04-1,1).c_str()); 
		}else{
			arr02[i]=0;
		}
		
	}
	//----------------------初始化数组--end-------------------- 


	//开始计算 
	int temp= 0;
	int flag = 0;
	for(int i=num03-1;i>=0;i--){
		temp = arr01[i]+arr02[i]+flag;
		if(temp>=10){
			arr03[i]=temp%10;
			flag=1;
		}else{
			arr03[i]=temp;
			flag=0;
		}
	}
	
	//输出的3种情况
	
	//1.数组的第1个为0,并且长度要大于等于2,输出时去掉第1个 
	if(arr03[0]==0&&num03>=2){
		for(int i=1;i<num03;i++){
			printf("%d",arr03[i]);
		} 
	//2.数组的第1个为1 ,输出时是整个数组 
	}else if(arr03[0]==1){
		for(int i=0;i<num03;i++){
			printf("%d",arr03[i]);
		} 	
	//都不是的话就输出为0 
	}else{
		printf("%d",0);
	}
	

	return 0;
}

测试的结果截图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值