码迷,mamicode.com
首页 > 其他好文 > 详细

vector、string实现大数加法乘法

时间:2018-01-22 00:03:18      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:最大的   gpo   技术分享   sign   item   ssi   动态   ons   字符   

理解 vector 是一个容器,是一个数据集,里边装了很多个元素。与数组最大的不同是 vector 可以动态增长

用 vector 实现大数运算的关键是,以 string 的方式读入一个大数,然后将字串的每一个字符 s[i] 以 int 形式赋给 vector<int> a 中的每一个元素。然后将 a[i] 和 a[j] 加起来(或者乘起来)。每两个元素加起来的结果 <= 18,乘起来的结果 <= 81。

用 string 实现大数加法的方法跟 vector 差不多,但是用 string 做大数乘法就有点麻烦,我写了一会儿没写出来。

 

1. 用 vector 实现大数加法:

技术分享图片
 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 #include <cstdlib>
 5 
 6 //#define min(a,b) ((a>b)?(b):(a))
 7 //#define max(a,b) ((a>b)?(a):(b))
 8 using namespace std;
 9 
10 void bigSum(vector<int> &a, vector<int> &b, vector<int> &sum)
11 {
12     int i, j, k, tmp;
13     if( a.size() < b.size() )
14     {
15         vector<int> vectmp=a;
16         a=b;
17         b=vectmp;
18     }
19     
20     sum.assign(a.size(), 0);
21     for (i=a.size()-1, j=b.size()-1; i>=0; --i)
22     {
23         if(j>=0) 
24         {
25             sum[i]=a[i]+b[j];
26             j--;
27         }
28         else sum[i]=a[i];
29     }
30     
31     for (k = sum.size() - 1;   k >= 0; --k)
32     {
33         if (sum[k] > 9)
34         {
35             sum[k]-=10;
36             if(k!=0) sum[k-1]++;
37             else sum.insert(sum.begin(), 1);
38         }
39     }
40 }
41 
42 int main()
43 {
44     string x,y;
45     //freopen("in.txt","r",stdin);
46     while(cin>>x>>y)
47     {
48         vector<int> a,b,c;
49         for(int i=0; i<x.length(); ++i)
50             a.push_back(x[i]-‘0‘);
51         for(int i=0; i<y.length(); ++i)
52             b.push_back(y[i]-‘0‘);
53         
54         bigSum(a,b,c);
55         for(int i=0; i<c.size(); ++i)
56             cout<<c[i];
57         cout<<endl<<endl;
58     }
59     return 0;
60 }
技术分享图片

运行:

技术分享图片

 

 

2. string 实现大数加法:

技术分享图片
 1 //this algorithm is from "oj-killer" of code.google.com
 2 #include <iostream>
 3 #include <cstdlib>     //freopen
 4 #include <string>    //string
 5 
 6 using namespace std;
 7 string Sum(string a,string b)
 8 {
 9     if(a.length()<b.length())
10     {
11         string temp=a; a=b; b=temp;
12     }
13     int i,j;
14     for(i=a.length()-1,j=b.length()-1;i>=0;i--,j--)
15     {
16         a[i]=(a[i]+(j>=0?b[j]-‘0‘:0));
17         if(a[i]>‘9‘)
18         {
19             a[i] -=10;
20             if(i) a[i-1]++;
21             else a=‘1‘+a;
22         }
23     }
24     return a;
25 }
26 int main()
27 {
28     string s1,s2;
29     freopen("in.txt", "r", stdin);
30     //freopen("out.txt", "w", stdout);
31     while(cin>>s1>>s2)
32     {
33         cout<<"s1:\t"<<s1<<endl<<"s2:\t"<<s2<<endl;
34         cout<<"Sum:\t"<<Sum(s1,s2)<<endl<<endl;
35     }
36     return 0;
37 }
技术分享图片

运行:

技术分享图片

 

 

3. vector 实现大数乘法:

输入:n

输出:2^(n+1)-1

该算法来自:http://hi.baidu.com/hehui1500/item/6711a09f18590fd91e4271fc

技术分享图片
 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 using namespace std;
 5 
 6 void multiply(const vector<int> &a, const vector<int> &b, vector<int> &result);
 7 
 8 int main(void)
 9 {
10     int i, j, n;
11     while(cin >> n)
12     {
13         vector<int> a, b, c;
14 
15         a.push_back(1);
16         b.push_back(2);
17 
18         for(i = 0; i <= n; ++i)
19         {
20             c.assign(a.size() + b.size() - 1, 0);
21             multiply(a, b, c);
22             a = c;
23         }
24         
25         for (i = 0; i < a.size() - 1; ++i)
26             cout << a[i];
27         cout << c[a.size() - 1] - 1;
28         cout << endl;
29     }
30     return 0;
31 }
32 
33 void multiply(const vector<int> &a, const vector<int> &b, vector<int> &result)
34 {
35     int i, j, k;
36     int tmp;
37 
38     for (i = 0; i < a.size(); ++i)
39     {
40         k = i;
41         for (j = 0; j < b.size(); ++j)
42             result[k++] += a[i] * b[j];
43     }
44 
45     for (k = result.size() - 1;   k >= 0; --k)
46     {
47         if (result[k] > 9)
48         {
49             if (k != 0)
50             {
51 
52                 result[k - 1] += result[k] / 10;
53                 result[k] %= 10;
54             }
55             else 
56             {
57                 tmp = result[k] / 10;
58                 result[k] %= 10;
59                 result.insert(result.begin(), tmp);
60             }
61         }
62     }
63 }
技术分享图片

运行:

技术分享图片

vector、string实现大数加法乘法

标签:最大的   gpo   技术分享   sign   item   ssi   动态   ons   字符   

原文地址:https://www.cnblogs.com/Pjson/p/8325890.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!