面试题二(高精度算法)
来源:互联网 发布:java简单工作流系统 编辑:程序博客网 时间:2024/05/18 00:42
高精度整数加法
要求实现函数:
void add (const char *num1, const char *num2, char *result)
【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-'
num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-'
【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
注:
I、 当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;
II、 输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;
III、 要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。
示例
输入:num1 = "580"
num2 = "-50"
输出:result = "530"
输入:num1 = "580"
num2 = "-600"
#include <stdio.h>#include <assert.h>#include <string.h>void convert(char *str) ///////////////字符串倒序{int lent=strlen(str);for (int i=0;i<=(lent-1)/2;i++){int temp=str[i];str[i]=str[lent-1-i];str[lent-1-i]=temp;}}void add (const char *num1, const char *num2, char *result){assert(num1!=NULL && num2!=NULL && result!=NULL);int len1=strlen(num1); //////////串长int len2=strlen(num2);int ret[100]={0};char *pNum1=(char*)num1;char *pNum2=(char*)num2;char *pResult=result;bool IsNum1PosInt=true; ////////////判断符标记bool IsNum2PosInt=true;bool IsExchange=false; ///////////是否交换两个数的信息标志位,将绝对值大的数放在第一个数上。if (*pNum1=='-'){IsNum1PosInt=false;pNum1++;len1--;}if (*pNum2=='-'){IsNum2PosInt=false;pNum2++;len2--;}if (*pNum1=='0' || *pNum2=='0') /////////判断输入数据是否合格{printf("error input!");return;}if (len1<len2) ////////num1绝对值小于num2{IsExchange=true;}elseif(len1==len2) ///////长度相等的情况下,是否需要交换{int j=0;for (j=0;j<len1;j++){if (pNum1[j]<pNum2[j]){IsExchange=true;}elsebreak;}}if (IsExchange){char *temp=pNum1;////////////交换字符串pNum1=pNum2;pNum2=temp;temp=NULL;int lentemp=len1;////////////交换长度信息len1=len2;len2=lentemp;bool IsPostemp=IsNum1PosInt;IsNum1PosInt=IsNum2PosInt;IsNum2PosInt=IsPostemp;}convert(pNum1);convert(pNum2);if (!IsNum1PosInt^IsNum2PosInt) ////////同为正或者同为负{int i=0;for (i=0;i<len1;i++){if (i>=len2) //////////后面的都置为'0'{pNum2[i]='0';} ret[i]+=(pNum1[i]-'0')+(pNum2[i]-'0');if (ret[i]>=10){ret[i]=ret[i]%10;ret[i+1]++;}}if (!IsNum1PosInt) ///////判断是两正数相加还是两负数相加{pResult[0]='-';pResult++;}if (ret[i]==1) ///////如果有进位,长度加1{len1++;}}else ///////如果为一正一负,大数在前,小数在后,相减{int i=0;for (i=0;i<len1;i++){if (i>=len2){pNum2[i]='0';}ret[i]+=(pNum1[i]-'0')-(pNum2[i]-'0');if (ret[i]<0) ////////如果小于0,则需要借位。{ret[i]+=10;ret[i+1]--;}}if (ret[len1-1]==0){len1--;}if (!IsNum1PosInt){pResult[0]='-';pResult++;}}for (int j=0;j<len1;j++) //////将整型数组转换成字符串保存到结果字符串中{pResult[j]=*((char*)(ret+len1-1-j))+'0';}}void main(){char n1[100]="-90";char n2[100]="50";char ret[100]="";add(n1,n2,ret);puts(ret);}
- 面试题二(高精度算法)
- 算法面试题(二)
- 算法面试题二
- 常见面试题排序算法(二)
- 经典算法面试题(二)
- 面试题(二)
- 面试题(二)
- 面试题(二)
- 面试题(二)
- 面试题(二)
- 面试题(二)
- 面试题(二)
- 面试题(二)
- 面试题(二)
- 算法面试题-leetcode学习之旅(二)
- 面试题积累篇-简单算法(二)
- 面试题---求数据之和算法二
- 面试题二-- 算法与编程
- Struts2 welcome-file 使用 index.action
- 通过崩溃地址找错误行数之Delphi版
- Object-relational mapping solutions compared
- create database link
- T-SQL高级查询
- 面试题二(高精度算法)
- 教你怎样解除电脑开机密码
- Microsoft Visual C++ 6.0使用
- Java Card Technology for Smart Card's Architecture and Programmer's Guide (Zhiqun Chen)翻译版(PART 4,5)
- MSBuild 简解
- hadoop 学习过程的随记
- Structs配置解析
- 将图片缩放成指定大小(压缩方法)
- OpenCV学习笔记 OpenCV_SVN静态库的编译 .