算法___大整数运算

  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <string.h>
  4 #include <string>
  5 #include <stdlib.h>
  6 #include <algorithm>
  7 using namespace std;
  8 string MULTIPLY_INT(string str1 , string str2);
  9 string MINUS_INT(string str1 , string str2);
 10 inline int compare(string str1 , string str2)
 11 {
 12     if(str1.size() > str2.size())//初步比较 长度长的整数大
 13         return 1;
 14     else if(str1.size() < str2.size())
 15         return -1;
 16     else
 17         return str1.compare(str2);
 18     //若两数长度相等,按位比较,compare函数 :相等返回0, 大于返回1,否则返回-1
 19 }
 20
 21 //高精度加法
 22 string ADD_INT(string str1 , string str2)
 23 {
 24     int sign = 1;//符号位
 25     string str;
 26     if(str1[0] == ‘-‘)
 27     {
 28         if(str2[0] == ‘-‘)
 29         {
 30             sign = -1;
 31             str = ADD_INT(str1.erase(0,1) , str2.erase(0,1));
 32         }
 33         else
 34             str = MINUS_INT(str2 , str1.erase(0,1));
 35     }
 36     else
 37     {
 38         if(str2[0] == ‘-‘)
 39             str = MINUS_INT(str1 , str2.erase(0,1));
 40         else//把两个数,短整数前加0补齐
 41         {
 42             string :: size_type len1,len2;
 43             int i;
 44             len1 = str1.size();
 45             len2 = str2.size();
 46             if(len1 < len2)
 47             {
 48                 for( i =1 ; i <= len2 - len1 ; i++)
 49                     str1 = "0" + str1;
 50             }
 51             else if(len1 > len2)
 52             {
 53                 for(i = 1 ; i <= len1 - len2 ; i++)
 54                     str2 = "0" + str2;
 55             }
 56             int int1 = 0 , int2 = 0 ;//int2 记录进位
 57             for( i = str1.size() - 1 ; i >= 0 ; i--)
 58             {
 59                 int1 = (int (str1[i]) - 48 + int(str2[i]) - 48 + int2) % 10;//48 ASCII of 0
 60                 int2 = (int (str1[i]) - 48 + int(str2[i]) - 48 + int2) / 10;
 61                 str = char(int1 + 48) + str;
 62             }
 63             if(int2 != 0)
 64                 str = char(int2 + 48) + str;
 65         }
 66     }
 67     //处理符号位
 68     if((sign == -1) && (str[0] != ‘0‘))
 69         str = "-" + str;
 70     return str;
 71 }
 72
 73 //高精度减法
 74 string MINUS_INT (string str1 , string str2)
 75 {
 76     int sign = 1;// 符号位
 77     string str;
 78     if(str2[0] == ‘-‘)
 79         str = ADD_INT(str1 , str2);
 80     else
 81     {
 82         int res = compare(str1 , str2);
 83         if(res == 0)
 84             return "0";
 85         if(res < 0)
 86         {
 87             sign = -1;
 88             string temp = str1;
 89             str1 = str2;
 90             str2 = temp;
 91         }
 92         string :: size_type tempint;
 93         tempint = str1.size() - str2.size();//两数相差位数
 94         for(int i = str2.size() -1 ; i >= 0 ; i--)//str2.size() -1 str2 最低位
 95         {
 96             if(str1[i + tempint] < str2[i])//str1[i + tempint] 与str2 对应位数的数
 97             {
 98                 str1[i + tempint -1] = char(int (str1[i + tempint - 1])-1);//借位 高位减一
 99                 str = char(str1[i + tempint] - str2[i] + 58) + str;// 58 ASCII of 10
100             }
101             else
102                 str = char(str1[i + tempint] - str2[i] + 48) + str;
103
104         }
105         for(int i = tempint -1 ; i >=0 ; i--)
106             str = str1[i] + str;//将数补全
107     }
108     //去除结果中多余的前导0
109     str.erase(0,str.find_first_not_of(‘0‘));
110     if(str.empty())
111         str = "0";
112     if((sign == -1) && str[0] != ‘0‘)
113         str = "-" + str;
114     return str;
115 }
116
117 //高精度乘法
118 string MULTIPLY_INT(string str1 , string str2)
119 {
120     int sign = 1;//符号位
121     string str;
122     if(str1[0] == ‘-‘)
123     {
124         sign *= -1;
125         str1 = str1.erase(0,1);
126     }
127     if(str2[0] == ‘-‘)
128     {
129         sign *= -1;
130         str2 = str2.erase(0,1);
131     }
132     int i,j;
133     string :: size_type len1,len2;
134     len1 = str1.size();
135     len2 = str2.size();
136     for(i = len2 - 1 ; i >= 0 ; i--)//实现手工乘法
137     {
138         string tempstr;
139         int int1 = 0 , int2 = 0 , int3 = int(str2[i]) - 48;
140         if(int3 != 0)
141         {
142             for(j = 1 ; j <= (int)(len2 - 1 - i) ; j++)
143                 tempstr = "0" + tempstr;
144             for(j = len1 - 1 ; j >= 0 ; j--)
145             {
146                 int1 = (int3 * (int(str1[j]) - 48) + int2) % 10;
147                 int2 = (int3 * (int(str1[j]) - 48) + int2) / 10;
148                 tempstr = char(int1 + 48) + tempstr;
149             }
150             if(int2 != 0)
151                 tempstr = char(int2 + 48) + tempstr;
152         }
153                 str = ADD_INT(str,tempstr);
154     }
155         //去除结果中的前导0
156     str.erase(0,str.find_first_not_of(‘0‘));
157     if(str.empty())
158         str = "0";
159     if((sign == -1) && (str[0] != ‘0‘))
160         str += "-" + str;
161     return str;
162 }
163 string DIVIDE_INT(string str1, string str2, int flag)
164 {
165     //flag = 1时,返回商; flag = 0时,返回余数
166     string quotient, residue;
167     int sign1 = 1, sign2 = 1, i;
168     if(str2 == "0")
169     {                                 //判断除数是否为0
170         quotient = "ERROR!";
171         residue = "ERROR!";
172         if(flag == 1) return quotient;
173         else return residue;
174     }
175     if(str1 == "0")
176     {                                 //判断被除数是否为0
177         quotient = "0";
178         residue = "0";
179     }
180     if(str1[0] == ‘-‘)
181     {
182         str1 = str1.erase(0, 1);
183         sign1 *= -1;
184         sign2 = -1;
185     }
186     if(str2[0] == ‘-‘)
187     {
188         str2 = str2.erase(0, 1);
189         sign1 *= -1;
190     }
191     int res = compare(str1, str2);
192     if(res < 0)
193     {
194         quotient = "0";
195         residue = str1;
196     }
197     else if(res == 0)
198     {
199         quotient = "1";
200         residue = "0";
201     }
202     else
203     {
204         string::size_type len1, len2;
205         len1 = str1.size(); len2 = str2.size();
206         string tempstr;
207         tempstr.append(str1, 0, len2 - 1);
208
209         //模拟手工除法
210         for(i = len2 - 1; i < len1; i++)
211         {
212             tempstr = tempstr + str1[i];
213             for(char ch = ‘9‘; ch >= ‘0‘; ch --)
214             {
215                 string str;
216                 str = str + ch;
217                 if(compare(MULTIPLY_INT(str2, str), tempstr) <= 0)
218                 {
219                     quotient = quotient + ch;
220                     tempstr = MINUS_INT(tempstr, MULTIPLY_INT(str2, str));
221                     break;
222                 }
223             }
224         }
225         residue = tempstr;
226     }
227
228     //去除结果中的前导0
229     quotient.erase(0, quotient.find_first_not_of(‘0‘));
230     if(quotient.empty()) quotient = "0";
231     if((sign1 == -1) && (quotient[0] !=‘0‘))
232         quotient = "-" + quotient;
233     if((sign2 == -1) && (residue[0] !=‘0‘))
234         residue = "-" + residue;
235     if(flag == 1) return quotient;
236     else return residue;
237 }
238
239 //高精度除法,返回商
240 string DIV_INT(string str1, string str2)
241 {
242     return DIVIDE_INT(str1, str2, 1);
243 }
244
245 //高精度除法,返回余数
246 string MOD_INT(string str1, string str2)
247 {
248     return DIVIDE_INT(str1, str2, 0);
249 }

基本照模板敲的,感觉要gg了

时间: 2024-11-10 00:45:14

算法___大整数运算的相关文章

算法学习——大整数运算(高精度)C++

1.大整数加法 用数组来存储大整数的每一位,然后模拟人工运算,用for循环按位运算和处理,原理十分简单,直接上模板. #include<iostream> #include<vector> using namespace std; //大整数加法 vector<int> add(vector<int>& A,vector<int>& B){ vector<int> C; int t = 0; for(int i = 0

大整数运算

对于A,B的范围在int范围内,求解A与B的加减乘除运算我相信大家很快就可以写出程序来,但是如果A,B是有着1000个数位的整数呢?恐怕就没有已有的数据类型来表示了,这时候只能老实的模拟加减乘除运算的过程.模拟加减乘除的运算的过程,原理就是小学的. 大整数又称为高精度整数,其含义就是用基本的数据类型无法存储其精度的整数.大整数运算即高精度运算. 首先,介绍大整数的存储. 很简单,用数组即可.例如,int型数组d[1000]:如将123456存储到数组中,则有d[0]=6,d[1]=5......

大整数运算模板总结

大整数运算模板总结. 大整数结构体表示 整型数组从低位到高位顺序存储每一位数字,另外需要存储数字的长度. struct bign { int d[1000]; int len; bign(){ memset(d, 0, sizeof(d)); len = 0; } }; 大整数输入 一般通过字符串输入. bign Change(string str)//输入字符串转大整数 { bign a; a.len = str.length(); for (int i = 0; i < a.len; i++

大整数算法[01] 大整数的表示和相关定义

★ 相关的数据类型定义 在干正事之前,先定义好各种数据类型还是很有必要的,避免在以后的编码中引起混乱. uintX   X位无符号整形,如uint32表示32位无符号整形 intX    X位有符号整形,如int32表示32位有符号整形 基本数据类型定义: #ifdef _MSC_VER            typedef __int8              int8;            typedef __int16             int16;            typ

大整数运算C++1

//下面的代码勉强算是bignum_beta1版本! //实现了大整数的加减乘除四则运算,以及求两个整数的最大公约数,以及求乘法逆,miller_rabin素性检验,平方_乘法算法 //不足之处,位数还很难扩展至几千位,以及运算速度有一点慢,既然是beta1,说明bug还是挺多的 //程序缺少测试数据来测试,所以有的结果不敢保证其正确性 //由于使用c++复写了很多运算符,加入这个文件之后,大数bignum可以看做是一个如同如同int一样的基本类型 //可以像int一样加减乘除和输入输出 #in

大整数运算C++

//下面的代码勉强算是bignum_beta1版本! //实现了大整数的加减乘除四则运算,以及求两个整数的最大公约数,以及求乘法逆,miller_rabin素性检验,平方_乘法算法 //不足之处,位数还很难扩展至几千位,以及运算速度有一点慢,既然是beta1,说明bug还是挺多的 //程序缺少测试数据来测试,所以有的结果不敢保证其正确性 //由于使用c++复写了很多运算符,加入这个文件之后,大数bignum可以看做是一个如同如同int一样的基本类型 //可以像int一样加减乘除和输入输出 #in

基于Java的大整数运算的实现(加法,减法,乘法)学习笔记

大整数,顾名思义就是特别大的整数. 一台64位的机器最大能表示的数字是2的64次方减一: 18446744073709551615 java语言中所能表示的整数(int)最小为-2147483648 public class test { public static void main(String[] args) { System.out.println(Integer.MIN_VALUE); } } 最大为 2147483647 public class test { public stat

大整数运算---模拟笔算

/* *m=a[k]×10k-1+a[k-1]×10k-2+-.+a[2]×10+a[1] *其中a[0]保存该长整数的位数. * *模拟笔算 */ #include<iostream> #include<cstring> using namespace std; #define SIZE 255 void getl(char* n);//获取长整数 void prt(char* n);//打印长整数 int cmp(char* n1, char* n2);//比较长整数大小 vo

算法笔记-----大整数相+------数组---效率

1 // 2 // Created by alim on 2017/12/23. 3 // 4 5 6 #include <stdlib.h> 7 #include <cstring> 8 #include <iostream> 9 using namespace std; 10 11 #define M 100 12 13 char sa[1000]; 14 char sb[1000]; 15 16 typedef struct _Node{ 17 int s[M];