设为首页 收藏本站
查看: 1028|回复: 0

[经验分享] 华为 题目大数据计算器

[复制链接]

尚未签到

发表于 2017-7-10 17:23:13 | 显示全部楼层 |阅读模式
  2.大数加减
  问题描述:
  在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在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"



#include <stdio.h>
#include <string.h>
//【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-';num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位'-' 【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
void change(char * str)
{
int num =strlen(str);
int i ;
int tmp;
for(i = 0;i <= (num/2 -1 ); i++)
{
tmp = str;
str = str[num - i -1];
str[num -1 -i] = tmp;
}
}
void jinwei(char *str)
{
int num = strlen(str);
if(str[num-1] !='-')
{
for(int i = 0;i<num;i++ )
{
if(str >= 0x3a)
{
str[i+1]++;
str= str - 10;
if(i == num-1)
{
str[i+1] = '1';
}
}
}
}
else
{
for(int i = 0;i<num-1;i++ )
{
if(str >= 0x3a)
{
str[i+1]++;
str= str - 10;
if(i == num-2)
{
str[i+1] = '1';
str[i+2] = '-';
}
}
}
}
}
void jinwei2(char *str)
{
int num = strlen(str);
for(int  i =0;i<num-1;i++)
{
if(str<0x30)
{
str[i+1]--;
str=str+10;
}
}
}
void add ( const char *num1,const char *num2, char *result)
{
char num11[50] ="";
char num22[50] ="";
strcpy(num11,num1);
strcpy(num22,num2);
change(num11);
change(num22);
int i1 = strlen(num11);
int i2 = strlen(num22);
int imin ;
int  i;
int flag;
int t;
if(num1[0] !='-' && num2[0] !='-')
{
i1 >= i2 ? (imin = i2 ) : (imin = i1);//得到加数字中字符串较小的
i1 >= i2 ? (flag = 2) : (flag = 1);  //标志位 哪一个是较小的字符串
for(i=0;i<imin;i++)
{
result = num11 + num22 - 0x30;
}
if(flag == 2)
for(;i<i1;i++)
result = num11;
else if(flag == 1)
for(;i<i2;i++)
result = num22;
}
if(num1[0] =='-' && num2[0] =='-')
{
i1 >= i2 ? (imin = i2 ) : (imin = i1);//得到加数字中字符串较小的
i1 >= i2 ? (flag = 2) : (flag = 1);  //标志位 哪一个是较小的字符串
for(i=0;i<imin-1;i++)
{
result = num11 + num22 - 0x30;
}
if(flag == 2)
for(;i<i1;i++)
result = num11;
else if(flag == 1)
for(;i<i2;i++)
result = num22;
}
if(num1[0] !='-' && num2[0] =='-')
{
change(num11);
change(num22);
flag = strcmp(num11,(num22+1));
if(flag > 0)//正数大于负数
{
change(num11);
change(num22);
for(i =0;i< i1;i++)
{
if(i<i2-1)
result = num11 - num22 + '0';
else
result = num11;
}
}
if(flag < 0)//正数小于负数
{
change(num11);
change(num22);
for(i = 0;i<i2;i++)
{
if(i<i1)
result = num22 - num11 + '0';
else
result = num22 ;
}
}
if(flag == 0)
result[0] = '0';
}
if(num1[0] =='-' && num2[0] !='-')
{
change(num11);
change(num22);
flag = strcmp((num11+1),num22);
if(flag > 0)//正数xiao于负数
{
change(num11);
change(num22);
for(i = 0;i<i1;i++)
{
if(i<i2)
result = num11 - num22 + '0';
else
result = num11;
}
}
if(flag < 0)//正数da于负数
{
change(num11);
change(num22);
for(i =0;i< i2;i++)
{
if(i<i1-1)
result = num22 - num11 + '0';
else
result = num22  ;
}
}
if(flag == 0)
result[0] = '0';
}
}
void qianyi(char *str)
{
int i =0;
for(i = 1;i<strlen(str);i++)
{
str[i-1] = str;
}
}
void xianshi(char *str)
{
int  i;
if(str[0] == '-')
for(i = 1;i<strlen(str);)
{
if(str == '0')
{
qianyi((str+i));
str[strlen(str)-1] = '\0';
}
else
break ;
}
else
for(i = 0;i<strlen(str);i++)
{
if(str == '0')
qianyi((str+i));
else
break ;
}
}
int main()
{
char  a1[] = "580";
char a2[] = "-600";
char a3[50] = "";
//char a3[] ;
add(a1,a2,a3);
//change(a1);
if(a1[0]!=a2[0])
jinwei2(a3);
else
jinwei(a3);
change(a3);
xianshi(a3);
printf("%s",a3);
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-392440-1-1.html 上篇帖子: 任正非反思:华为会不会是下一个美联航?(企业必需以客户为中心,以员工为中心就完了) 下篇帖子: 华为上机:统计给定的两个数之间的素数的个数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表