最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对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为大整数相加"机试题的更多相关文章

  1. HDU 1002 A + B Problem II(大整数相加)

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

  2. SOJ 1002/1003/1004 大整数相加/相乘/相除

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

  3. HDOJ-1002 A + B Problem II (非负大整数相加)

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

  4. 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 ...

  5. 大整数相加 a+b 的c语言实现

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

  6. C++ string 实现大整数相加减

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

  7. Javascript实现大整数加法

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

  8. 华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)

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

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

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

随机推荐

  1. biztalk中使用WCF-SQL接受传送数据【转】

    接触biztalk时间不长,转载一篇学习教程: http://www.cnblogs.com/chnking/archive/2010/05/09/1731098.html chnking写的. 一. ...

  2. 一个socket发送调试信息的类

    using UnityEngine; using System.Collections; using System; using System.Net.Sockets; using System.Ne ...

  3. GCJ 2015-Qualification-C Dijkstra 特殊注意,展开 难度:2

    https://code.google.com/codejam/contest/6224486/dashboard#s=p2 题目中的新运算满足传递性不满足自反性,满足传递性则可以先计算后面的部分再计 ...

  4. 使用ASP.Net WebAPI构建REST服务(二)——路由

    REST并没有像传统的RPC服务那样显式指定了服务器函数的访问路径,而是将URL根据一定的规则映射为服务函数入口,这个规则就称之为路由.Asp.Net WebAPI的路由方式和Asp.Net MVC是 ...

  5. 【个人使用.Net类库】前言

    个人接触.Net是在2013年8月份到了一家新的公司开始的. 目前为止,发现自己的知识储备如下: 基本的WinForm编程,但没做过对应项目. 基本的Asp.Net页面,做过查询.树形菜单.登录的小功 ...

  6. Program E-- CodeForces 18C

    Description Once Bob took a paper stripe of n squares (the height of the stripe is 1 square). In eac ...

  7. 国产ProcessOn和国外gliffy的对比区别【原创】

    之前一直在用国外的作图工具gliffy,不足之处gliffy是英文的,很多国内相关从业者使用起来就有一定门槛,今天我给大家再推荐一款比gliffy更方便的作图工具ProcessOn,除了绘制UML建模 ...

  8. C# TCP实现多个客户端与服务端 数据 与 文件的传输

    C#菜鸟做这个东东竟然花了快三天的时间了,真是菜,菜,菜--- 下面是我用C#写的 一个简单的TCP通信,主要的功能有: (1) 多个客户端与服务器间的数据交流 (2)可以实现群发的功能 (3)客户端 ...

  9. git——学习笔记(一)

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013745374151782e ...

  10. iOS NSDictionary、NSData、JSON数据类型相互转换

    iOS经常需要用到数据类型的转换,下面列举一下常用类型的转换. 1.NSDictionary类型转换为NSData类型: //NSDictionary -> NSData: NSDictiona ...