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

来源:互联网 发布:多张表格数据汇总透视 编辑:程序博客网 时间:2024/04/30 22:13

昨天无意中去了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;}} //去掉第二个数字串前面的 0for(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
原创粉丝点击