关于10月28日微创笔试中的前两个题目

类别:编程语言 点击:0 评论:0 推荐:

在论坛C++版看到的面试题,拿来研究研究。
1)实现string toHex(int)把一个十进制转换成十六进制。(完全用算法实现)
2)实现一个计算大位数(如100位以上)相乘结果的函数string multiply(sting,string)。(请完全用算法实现)
第一个题目很简单,就是用十进制数不停的除以16,将所有的余数累加起来便是结果。我用C++简单的实现了一下,下面是代码(VC++.NET/windows xp):
#include <iostream>
#include <string>
using namespace std;

string ToHex(int dec)
{
  unsigned int udec = (dec>=0)?(dec):(-dec), yushu;
  int pos = 8;
  char Hex[11];
  memset(Hex, '0', 9);
  Hex[9] = 'H';
  Hex[10] = '\0';

  do//求余数
  {
    yushu = udec%16;
    Hex[pos--] = (yushu>9)?(yushu+55):(yushu+48);
    udec = udec/16;
  }
  while (udec!=0);
  if (Hex[pos+1]>64)//如果最高位是字母,则字符串前面补0
    Hex[pos] = '0';
  else
    ++pos;
  if (dec<0)//如果是负数,在前面加负号
    Hex[--pos] = '-';

  return (string(Hex+pos));
}

int _tmain(int argc, _TCHAR* argv[])
{
  int i;
  cin>>i;
  string sHex = ToHex(i);
  cout<<endl<<sHex;
  return 0;
}
第二个题目挺复杂的,大位数的乘法是不能使用atoi将字符串化为整型在相乘的,那样会溢出。模拟手算也不太可能,因为手算的话需要大量的内存记录中间结果。
我想到的比较好的方法是模拟计算机中的乘法。我这个学期刚刚学的计算机组成原理里有讲到关于计算机中原码一位乘法的实现。关于这种方法的具体内容大家可以很容易的在网上找到。使用这种方法计算n位数乘法的话只需2n+2位的缓冲。但是实现起来挺麻烦的,真的行不行我心里也没底。我只是阐述一下我的看法,大家有什么看法欢迎讨论。

本文地址:http://com.8s8s.com/it/it26003.htm