c语言输入三个数如128,华为"128为大整数相加"机试题

最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对memmove()函数效率有了进一步把握.

#include

#include

using namespace std;

#define MAX_LENGTH 128

void Add(const char *pszOperand1, const char *pszOperand2, char *pszResult); //互联网上原始代码

void Add2(const char *pszOperand1, const char *pszOperand2, char *pszResult, size_t len ); //优化后的代码

int main()

{

char szOperand1[MAX_LENGTH + 1], szOperand2[MAX_LENGTH + 1], szResult[MAX_LENGTH + 2];

cin >> szOperand1 >> szOperand2;

clock_t startTime = clock();

for ( int i = 0; i < 100000000; ++i ) //原始代码测试

{

Add(szOperand1, szOperand2, szResult);

}

clock_t endTime = clock();

cout << szOperand1 << " + " << szOperand2 << " = " << szResult << endl;

cout << "Total time = " << endTime - startTime << endl; //132725ms

startTime = clock();

for ( int i = 0; i < 100000000; ++i ) //优化后代码测试

{

Add2( szOperand1, szOperand2, szResult, MAX_LENGTH+2 );

}

endTime = clock();

cout << szOperand1 << " + " << szOperand2 << " = " << szResult << endl;

cout << "Total time = " << endTime - startTime << endl; //84287ms

//总结:Add2()函数比Add()函数在使用了memmove()优化后效率提升了36.28%,而空间节省了40%。

return 0;

}

void Add(const char *pszOperand1, const char *pszOperand2, char *pszResult)

{

short iResult[MAX_LENGTH + 1];

short iCarry = 0;

int i = (int) strlen(pszOperand1) - 1;

int j = (int) strlen(pszOperand2) - 1;

int k = MAX_LENGTH + 1;

while (i >= 0 || j >= 0)

{

k--;

iResult[k] = 0;

if (i >= 0)

iResult[k] += pszOperand1[i--] - '0';

if (j >= 0)

iResult[k] += pszOperand2[j--] - '0';

iResult[k] += iCarry;

if (iResult[k] >= 10)

{

iResult[k] -= 10;

iCarry = 1;

}

else

iCarry = 0;

}

if (iCarry == 1)

iResult[--k] = 1;

i = 0;

for (; k <= MAX_LENGTH; k++, i++)

pszResult[i] = iResult[k] + '0';

pszResult[i] = '\0';

}

void Add2(const char *pszOperand1, const char *pszOperand2, char *pszResult, size_t len )

{

size_t i = strlen( pszOperand1 );

size_t j = strlen( pszOperand2 );

if ( len < (max(i, j) +2 ) )

return;

size_t k = len;

pszResult[--k] = '\0';

short temp = 0;

short curso = 0;

while ( i > 0 || j > 0 )

{

temp = curso;

if ( i > 0 )

temp += pszOperand1[--i] - '0';

if ( j > 0 )

temp += pszOperand2[--j] - '0';

if ( temp > 10 )

{

pszResult[--k] = temp - 10 + '0';

curso = 1;

}

else

{

pszResult[--k] = temp + '0';

curso = 0;

}

}

memmove( pszResult, pszResult + k, len - k );

}

测试用例:被加数与加数都是下面的120位整数

123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890

测试环境:

编译器  :vs 2005

操作系统:windows7 64 bit

处理器  :英特尔 Pentium(奔腾) G860 @ 3.00GHz 双核

内存    :4 GB ( 金士顿 DDR3 1600MHz )

总结:Add2()函数比Add()函数在使用了memmove()优化后效率提升了36.28%,而空间节省了40%。

HDU 1002 A &plus; B Problem II(大整数相加)

A + B Problem II Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

SOJ 1002&sol;1003&sol;1004 大整数相加&sol;相乘&sol;相除

三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反 ...

HDOJ-1002 A &plus; B Problem II (非负大整数相加)

http://acm.hdu.edu.cn/showproblem.php?pid=1002 输入的数都是正整数,比较好处理,注意进位. //非负大整数加法 # include

1024 Palindromic Number int&lowbar;string转换 大整数相加

A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...

大整数相加 a&plus;b 的c语言实现

终于来到我所期盼的高精度整数相加的题目了.这个题很经典,也算是一个很好的算法入门题吧. 如果是java的话,系统类库已经内置了BigInteger类,直接调用就可以很轻易地解决了.但是学习c的编写也是 ...

C&plus;&plus; string 实现大整数相加减

随意两个大整数的加减算法.可自己主动推断正负号.代码例如以下: #include #include #include

Javascript实现大整数加法

记得之前面试还被问到过用两个字符串实现两个大整数相加,当时还特别好奇好好的整数相加,为什么要用字符串去执行.哈哈,感觉当时自己还是很无知的,面试官肯定特别的无奈.今天在刷算法的时候,无意中看到了为什么 ...

华为OJ机试题目:两个大整数相乘&lpar;纯C语言实现两个大整数相乘,两种方法实现大数相乘&rpar;

题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...

九度oj题目&amp&semi;amp&semi;吉大考研11年机试题全解

九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

随机推荐

TCP&sol;UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP部分的使用 框架源码结构 补充说明 源码地址 说明 之前有好几篇博客在讲TCP/UDP通信方 ...

XP系统下IIS常见的几个问题

随笔说明: 个人笔记.仅供参考 根据日常遇到的相关问题不定期增改 时间:2015年1月7日23:09 Soft:Microsoft .NET Framework 4(独立安装程序) Microsoft ...

&ast;&ast;&ast;电商数据库设计参考:ecshop数据库&plus;订单表结构等

ecshop订单表结构ecs_order_info说明 -- 表的结构 `ecs_order_info`    CREATE TABLE IF NOT EXISTS `ecs_order_info` ...

Java Day 07

构造函数 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:给对象初始化值 默认构造函数 如果没有自己定义构造函数,系统会自动生成: 如果定义了,则默认构造函数不会自动生成. 构造函数与一 ...

HDU4276 - The Ghost Blows Light&lpar;树形DP&rpar;

题目大意 给定一棵n个结点的树,每个结点上有一定数量的treasure,经过每条边需要花一定的时间,要求你从结点1出发,在不超过时间T的情况下,最多能够获得的treasure是多少,并且要求结束于结点 ...

width&colon;auto&semi; 和 width&colon;100&percnt;&semi;的不同

width:auto:会将元素撑开至整个父元素width,但是会减去子节点自己的margin,padding或者border的大小.width:100%:会强制将元素变成和父元素一样的宽,并且添加额外 ...

FFmpeg缩放swscale详解 &lt&semi;转&gt&semi;

利用ffmpeg进行图像数据格式的转换以及图片的缩放应用中,主要用到了swscale.h文件中的三个函数,分别是: struct SwsContext *sws_getContext(int srcW ...

【BZOJ1132】【POI2008】Tro 计算几何 叉积求面积

链接: #include int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

Maven之(四)Maven命令

常用命令 从某种意义上来说,软件是帮助不懂程序的人来操作计算机的,图形化界面尤其如此.在上个世纪,比尔盖茨之所以成为世界首富,微软之所以IT界的巨鳄,就是因为Windows开图形化操作之先河,并抢先占 ...

Python 协程&sol;异步IO&sol;Select&bsol;Poll&bsol;Epoll异步IO与事件驱动

1 Gevent 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值