关于大数算法的总结

关于大数算法的总结
@import url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 最近在学习游戏开发,又得重新看C++鸟,为了进行语法的熟悉决定再次进行刷oj,我刷的oj时杭电的oj。在1002题时候,卡了一下,但最终还是顺利通过。
大数加法是一项十分十分基本的编程技能,好鸟不啰嗦鸟。

算法核心思想:1.将字符串按照权重转换为整型数组中相应的位(0索引对应最低位,权重为1,是个位)。2.然后进行按照位相加运算。

具体代码如下。
 2  //   main.cpp
 3  //   oj
 4  //
 5  //   Created by sixleaves on 14-7-23.
 6  //   Copyright (c) 2014年 sixleaves. All rights reserved.
 7  //
 8 
 9 #include <iostream>
10 #include < string>
11 #include <cstdlib>
12  const  int ArSize = 1024;
13  using  namespace std;
14  char *psResult =  new  char[ArSize]; //     分配于堆中,不是局部变量
15  char* sum( string a,  string b);

16  int main( int argc,  const  char * argv[])
17 {
18 
19      int nTestCase;
20      int i = 0;
21     cin >> nTestCase;
22      while (i < nTestCase) {
23          string a,b;
24          while (cin >> a >> b) {
25             cout << "Case " << i + 1 <<":"<< endl;
26             cout << a + " + " + b + " = "
27                  <<sum(a, b) << endl;
28              if(i + 1 != nTestCase)
29                 cout << endl;
30             i++;
31              break;
32         }
33     }
34      return 0;
35 }
36 
37  char* sum( string a,  string b) {
38      //     进行数据的转换,把字符串数据转换为整数
39       //     char *psResult = new char[ArSize];
        //     为了提高程序速度,把这个放在了外面,不用每次都申请
40       int nR[ArSize] = {0}, nA[ArSize] = {0}, nB[ArSize] = {0}; //    并且都初始化为0
41       int nLenA = a.length(), nLenB = b.length();
42      for( int i = 0; i < nLenA; i++) {
43         nA[i] = a[nLenA - i - 1] - '0';
44     }
45      for( int i = 0; i < nLenB; i++) {
46         nB[i] = b[nLenB - i - 1] - '0';
47     }
48      //     进行相加运算
49       int nLenMax = nLenA > nLenB? nLenA : nLenB;
50      for( int i = 0; i < nLenMax; i++) {
51         nR[i] += nA[i] + nB[i];
52          if(nR[i] > 9) {
53             nR[i] -= 10;
54             nR[i + 1]++;
55         }
56     }
57      //    转换为字符串
58       if(nR[nLenMax] != 0) //    如果最后一位相加有近位,则总长度加1
59          nLenMax++;
60      for( int i = 0; i < nLenMax; i++) {
61         psResult[i] = nR[nLenMax - i - 1] + '0';
62     }
63     psResult[nLenMax] = '\0';
64      return psResult;
65 }
66 

你可能感兴趣的:(关于大数算法的总结)