您的位置:首页 > 编程语言

华为软件校园招聘编程上机题目(2)

2012-09-11 20:37 411 查看
题目来自:http://blog.csdn.net/yuliu0552/article/details/6726647

问题描述: 

在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下: 

9876543210 + 1234567890 = ?

让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"。 

-9876543210 + (-1234567890) = ?

让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = "-11111111100"。 

要求编程实现上述高精度的十进制加法。

要求实现函数: 
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"

输出:result = "-20"

//思路:1、若num1与num2同号,则str1,str2分别为num1,num2不带符号的翻转且str1为二者中不算符号较长的那个,则str1,str2从0开始对应位相加,ad用来记录进位,result[i]存储值,直到
// 两者之中的不带符号的最小长度lenMin,若num1长,则再将str1的剩余位与ad相加,ad记录进位,和值保留在result[]中,
// 最后,判断进位是否为1,若为1,在result[i]='1';i++;判断是否num1,num2为负数,(是的话,result[i]='-';i++;)result[i]='\0';
// 2、若num1与num2异号,将正的那个复制给str1,负的复制给str2:<1>若和为非负,str1[i]-str2[i]+ad保存在result[i]中;直到lenNum2;再将str1的剩余部分与ad相加,
// 保存在result中;<2>和为负,则str2[i]-str1[i]+ad保存在result[i]中;直到lenNum1;再将str2的剩余部分与ad相加,保存在result中,最后再添加
// ‘-’号在result中。
// 3、对结果进行处理,如-0090变为-90,0090变为90,去掉多余的0
#include <iostream>
using namespace std;

void add (const char *num1, const char *num2, char *result)
{
int lenNum1=strlen(num1),lenNum2=strlen(num2),fh1=0,fh2=0;
if(num1[0]=='-')
{
fh1=1;
}
if(num2[0]=='-')
{
fh2=1;
}
//长度去掉符号位
lenNum1=lenNum1-fh1;
lenNum2=lenNum2-fh2;
int temp=0,ad=0,flag1,flag2;
int lenMin=lenNum1>lenNum2?lenNum2:lenNum1;
int lenMax=lenNum1>lenNum2?lenNum1:lenNum2;
//将num1反转,num2反转,但不保留符号位,将二者较长的复制给str1,另一个给str2
char *str1,*str2;
if(lenNum1>lenNum2)
{
str1=(char*)malloc(sizeof(char)*lenNum1+1+fh1);
str2=(char*)malloc(sizeof(char)*lenNum2+1+fh2);
for(int i=0;i<lenNum1;i++)
{
str1[i]=num1[lenNum1-1-i+fh1];
}
str1[i]='\0';
for(i=0;i<lenNum2;i++)
{
str2[i]=num2[lenNum2-i-1+fh2];
}
str2[i]='\0';

}
else
{
str1=(char*)malloc(sizeof(char)*lenNum2+1+fh2);
str2=(char*)malloc(sizeof(char)*lenNum1+1+fh1);
for(int i=0;i<lenNum1;i++)
{
str2[i]=num1[lenNum1-1-i+fh1];
}
str2[i]='\0';
for(i=0;i<lenNum2;i++)
{
str1[i]=num2[lenNum2-i-1+fh2];
}
str1[i]='\0';
}
//判断num1符号
if(num1[0]=='-')
{
flag1=-1;
}
else
{
flag1=1;
}
//判断num2符号
if(num2[0]=='-')
{
flag2=-1;
}
else
{
flag2=1;
}

//开始计算,若两者同号
int point=0;
if(fh1==fh2)
{
ad=0;
for(int i=0;i<lenMin;i++)
{
temp=int(str1[i]-'0')+int(str2[i]-'0')+ad;
if(temp>9)
{
ad=1;
temp=temp-10;
result[i]=char(temp+'0');
}
else
{
ad=0;
result[i]=char(temp+'0');
}
}
point=i;
lenNum1=strlen(str1);
lenNum2=strlen(str2);
for(int k=point;k<lenNum1;k++)
{
temp=int(str1[k]-'0')+ad;
if(temp>9)
{
ad=1;
temp=temp-10;
result[k]=char(temp+'0');
}
else
{
ad=0;
result[k]=char(temp+'0');
}
}
if(ad==1)
{
result[k]='1';
k++;
}
if(num1[0]=='-')
{
result[k]=num1[0];
k++;
}
result[k]='\0';

}
//若两者符号不同
//若两者符号不同,将str1为复制正的那个字符串,str2复制负的那个字符串,num1D为1,表示两者和为非负;为-1,表示和的结果负
else
{
if(num1[0]!='-')
{
str1=(char*)malloc(sizeof(char)*lenNum1+1+fh1);
str2=(char*)malloc(sizeof(char)*lenNum2+1+fh2);
for(int i=0;i<lenNum1;i++)
{
str1[i]=num1[lenNum1-1-i+fh1];
}
str1[i]='\0';
for(i=0;i<lenNum2;i++)
{
str2[i]=num2[lenNum2-i-1+fh2];
}
str2[i]='\0';

}
else
{
str1=(char*)malloc(sizeof(char)*lenNum2+1+fh2);
str2=(char*)malloc(sizeof(char)*lenNum1+1+fh1);
for(int i=0;i<lenNum1;i++)
{
str2[i]=num1[lenNum1-1-i+fh1];
}
str2[i]='\0';
for(i=0;i<lenNum2;i++)
{
str1[i]=num2[lenNum2-i-1+fh2];
}
str1[i]='\0';
}
lenNum1=strlen(str1);
lenNum2=strlen(str2);
int num1D=0;
if(lenNum1>lenNum2)
num1D=1;
if(lenNum1<lenNum2)
num1D=-1;
if(lenNum1==lenNum2)
{
int ac=0;
for(int i=0;i<lenNum1;i++)
{
int temp=str1[i]-str2[i]+ac;
if(temp<0)
ac=-1;
else
ac=0;
}
if(ac==-1)
num1D=-1;
else
num1D=1;
}
//结果为非负,str1-str2>=0
if(num1D==1)
{
ad=0;
for(int i=0;i<lenMin;i++)
{
if((str1[i]+ad)<str2[i])
{
temp=int(str1[i]-'0')-int(str2[i]-'0')+ad+10;
result[i]=char(temp+'0');
ad=-1;
}
else
{
temp=int(str1[i]-'0')-int(str2[i]-'0')+ad;
result[i]=char(temp+'0');
ad=0;
}
}

for(int j=i;j<lenNum1;j++)
{
temp=str1[j]+ad-'0';
if(temp<0)
{
ad=-1;
result[j]=char(temp+10+'0');
}
else
{
ad=0;
result[j]=char(temp+'0');
}
}

result[j]='\0';
}
//结果为负
else
{
ad=0;
for(int i=0;i<lenMin;i++)
{
if((str2[i]+ad)<str1[i])
{

temp=int(str2[i]-'0')-int(str1[i]-'0')+ad+10;
result[i]=char(temp+'0');
ad=-1;
}
else
{
temp=int(str2[i]-'0')-int(str1[i]-'0')+ad;
result[i]=char(temp+'0');
ad=0;
}
}
for(int j=i;j<lenNum2;j++)
{
temp=str2[j]+ad-'0';
if(temp<0)
{
ad=-1;
result[j]=char(temp+10+'0');
}
else
{
ad=0;
result[j]=char(temp+'0');
}
}

result[j]='-';
result[j+1]='\0';

}
}

//重新倒置
int lenresult=strlen(result);
//把开始的0去掉
int m=0;
int d=0;
if(result[lenresult-1]=='-')
d=1;
else
d=0;
for(int i=lenresult-1-d;i>0;i--)
{
if(result[i]=='0')
m++;
else
break;
}
for( i=0;i<lenresult/2;i++)
{
char temp=result[i];
result[i]=result[lenresult-i-1];
result[lenresult-i-1]=temp;
}
if(m==lenresult-d)
{
result[0]='0';
result[1]='\0';
}
else
{
for(int j=0;j<lenresult-m;j++)
{
result[d+j]=result[d+j+m];
}
result[j]='\0';
}

}

int main()
{
char *num1 = "-125544654657567650";
char *num2 = "-5345352390";
char *result;
int len1=strlen(num1);
int len2=strlen(num2);
int len=len1>len2?len1:len2;
result=(char*)malloc(sizeof(char)*len+1);
add(num1,num2,result);
cout<<result<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: