昨天无意中去了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;
}
测试的结果截图: