第三章,课外作业(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
- 第三章,课外作业(C++,数字高精度之加法)
- 高精度加法(c++)
- C语言课外作业
- (C语言)高精度加法
- 高精度的加法(c++)
- 【C++】高精度加法
- C语言 高精度加法
- c高精度加法模板
- C语言高精度加法
- C-高精度加法
- 高精度之 加法(连加)
- 高精度运算之加法
- 高精度之加法
- 高精度之加法模板
- 高精度算法之加法
- 高精度基础之加法
- 高精度之加法
- 高精度计算之加法
- iOS Socket使用大全
- 判断闰年的两种算法
- JS:1.什么是JavaScript?
- Stanford公开课机器学习---week1-1.Intrduction 机器学习介绍
- 【坑坑坑坑坑】strncpy是个坑
- 第三章,课外作业(C++,数字高精度之加法)
- SGU109 Magic of David Copperfield II
- JavaScript建立HTML
- java 反射 模拟spring自动注入
- 指定的网络名不再可用
- OC 数组排序方法论
- JAVA设计模式:观察者模式
- Java Servlet PDF文件生成
- [C/C++]_[初级]_[标准字符串std::string 所有函数的用法总结]