面试题二(高精度算法)

来源:互联网 发布: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);}


 

原创粉丝点击