华为"128为大整数相加"机试题
最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对memmove()函数效率有了进一步把握.
#include <time.h>
#include <iostream>
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%。
华为"128为大整数相加"机试题的更多相关文章
- HDU 1002 A + B Problem II(大整数相加)
A + B Problem II Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u De ...
- SOJ 1002/1003/1004 大整数相加/相乘/相除
三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反 ...
- HDOJ-1002 A + B Problem II (非负大整数相加)
http://acm.hdu.edu.cn/showproblem.php?pid=1002 输入的数都是正整数,比较好处理,注意进位. //非负大整数加法 # include <stdio.h ...
- 1024 Palindromic Number int_string转换 大整数相加
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
- 大整数相加 a+b 的c语言实现
终于来到我所期盼的高精度整数相加的题目了.这个题很经典,也算是一个很好的算法入门题吧. 如果是java的话,系统类库已经内置了BigInteger类,直接调用就可以很轻易地解决了.但是学习c的编写也是 ...
- C++ string 实现大整数相加减
随意两个大整数的加减算法.可自己主动推断正负号.代码例如以下: #include <iostream> #include <vector> #include <cstri ...
- Javascript实现大整数加法
记得之前面试还被问到过用两个字符串实现两个大整数相加,当时还特别好奇好好的整数相加,为什么要用字符串去执行.哈哈,感觉当时自己还是很无知的,面试官肯定特别的无奈.今天在刷算法的时候,无意中看到了为什么 ...
- 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
随机推荐
- 项目管理办公室 PMO
项目管理办公室是组织中指导,协调,支持项目管理工作的一个常设职能部门,也就是管理项目管理的常设职能部门. 它负责指定和贯彻标准化的项目管理方法论(包括工作流程与规章制度等),协调所辖的各项目对资源,工 ...
- myeclipse设置编码格式的4种情况
(1).设置myeclipse工作空间的编码格式,作用范围最大 window-->preference-->general-->workspace-->text file en ...
- 用户上网的基本流程图与DNS解析原理
1.用户上网发送请求,首先确认本地的hosts中是否含有域名,有则进行ip访问,如果没有呢?看本机的display缓存中有没有访问网站的ip,有就直接去访问 那么如果本地的hosts和缓存都没有呢?这 ...
- 怎么学好python?
文章摘自:http://www.jb51.net/article/16100.htm 1)学好python的第一步,就是马上到www.python.org网站上下载一个python版本.我建议初学者, ...
- 解决JavaScript中使用$.ajax方式提交数组参数
一般的,可能有些人在一个参数有多个值的情况下,可能以某个字符分隔的形式传递,比如页面上有多个checkbox: $.ajax{ url:"xxxx", data:{ p: &quo ...
- 如何登录Google美国服务器
Google访问须知: ① 先访问一次 https://www.google.com/ncr ,禁止“国家重定向(No country Redirect) ” ② 再点击右上角齿轮图标,选第一项“Se ...
- Codeforces Round #327 (Div. 2)-Wizards' Duel
题意: 在一条长度为l的走廊,两个人站在走廊的左右两端分别以p,q的速度走来,问他们相遇时离左端的距离是多少? 思路: 非常简单的暴力题,不解释. 代码如下: #include <iostrea ...
- exit(0)与exit(1)、return区别
exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在主函数中,则会退出函数并返回一值. 详细说: 1. return返回函数值,是关键字 ...
- 在网页中编辑报表的报表设计器Stimulsoft Reports Designer.Web报表控件
Stimulsoft Reports Designer.Web报表控件是一款网页报表设计器.您想在网页中编辑您的报表吗?现在是可能的! Stimulsoft Reports Designer.Web ...
- 关键字const
const关键字常和指针一起使用. 1,const给读代码的人传达非常有用的信息.比如一个函数的参数是const char *,你在调用这个函数时就可以放心地传给它char *或const char ...