java 大数四则运算_大数四则运算java(转)

1 //大数的四则运算

2 #include

3 #include

4 #include

5 using namespace std;6

7 classBIGINTEGEROPERATIONS8 {9 private:10 static intCOMPARE(string number1, string number2)11 {12 intj;13

14 int length1 =number1.size();15 int length2 =number2.size();16

17 if(number1.size() == 0) number1 = "0";18 if(number2.size() == 0) number2 = "0";19

20 j = 0;21 for(int i = 0; i < length1; ++i)22 {23 if(number1[i] == ‘0‘) ++j;24 else break;25 }26 number1 =number1.substr(j);27

28 j = 0;29 for(int i = 0; i < length2; ++i)30 {31 if(number2[i] == ‘0‘) ++j;32 else break;33 }34 number2 =number2.substr(j);35

36 length1 =number1.size();37 length2 =number2.size();38

39 if(length1 >length2)40 {41 return 1;42 }43 else if(length1 ==length2)44 {45 if(number1.compare(number2) > 0)46 {47 return 1;48 }49 else if(number1.compare(number2) == 0)50 {51 return 0;52 }53 else

54 {55 return -1;56 }57 }58 else

59 {60 return -1;61 }62

63 return 0;64 }65

66 public:67 staticstring PLUS(string number1,string number2)68 {69 inti;70 int length1 =number1.size();71 int length2 =number2.size();72

73 string result="";74

75 reverse(number1.begin(), number1.end());76 reverse(number2.begin(), number2.end());77

78 for(i = 0; i < length1 && i < length2; i++)79 {80 char c = (char)(number1[i] + number2[i] - 48);81 result = result +c;82 }83

84 while(i

90 while(i

96 int carry = 0;97 for(i = 0; i < (int)result.size(); ++i)98 {99 int value = result[i] - 48 +carry;100 result[i] = (char)(value % 10 + 48);101 carry = value / 10;102 }103

104 if(carry !=0)105 {106 result = result + (char)(carry + 48);107 }108

109 for(i = result.size() - 1; i >= 0; i--)110 {111 if(result[i] != ‘0‘) break;112 }113

114 result = result.substr(0, i + 1);115

116 reverse(result.begin(), result.end());117 if(result.length() == 0) result = "0";118 returnresult;119 }120

121

122 staticstring MINUS(string number1,string number2)123 {124 inti;125 string result = "";126

127 int length1 =number1.size();128 int length2 =number2.size();129

130 if(COMPARE(number2,number1) > 0)131 {132 return "-" +MINUS(number2, number1);133 }134

135 reverse(number1.begin(),number1.end());136 reverse(number2.begin(),number2.end());137

138 for(i = 0; i < length1 && i < length2; i++)139 {140 char c = number1[i] - number2[i] + 48;141 result = result +c;142 }143

144 if(i

152 int carry = 0;153 for(i = 0; i < (int)result.length(); i++)154 {155 int value = result[i] - 48 +carry;156 if(value < 0)157 {158 value = value + 10;159 carry = -1;160 }161 else carry = 0;162 result[i]=(char)(value + 48);163 }164

165 for(i = result.size() - 1; i >= 0; i--)166 {167 if(result[i] != ‘0‘)break;168 }169

170 result = result.substr(0, i+1);171

172 reverse(result.begin(), result.end());173 if(result.length()==0) result = "0";174 returnresult;175 }176

177

178 staticstring MULTIPLY(string number1, string number2)179 {180 inti, j;181 int *iresult;182 int length1 =number1.size();183 int length2 =number2.size();184 string result = "";185

186 reverse(number1.begin(), number1.end());187 reverse(number2.begin(), number2.end());188

189 iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));190 memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));191

192 for(i = 0; i < length1; i++)193 {194 for(j = 0; j < length2; j++)195 {196 iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));197 }198 }199

200 int carry = 0;201 for(i = 0; i < length1 + length2; i++)202 {203 int value = iresult[i] +carry;204 iresult[i] = value % 10;205 carry = value / 10;206 }207

208 for(i = length1 + length2 - 1; i >= 0; i--)209 {210 if(iresult[i] != 0)break;211 }212

213 for(; i >= 0; i--)214 {215 result = result + (char)(iresult[i]+48);216 }217

218 free(iresult);219

220 if(result == "") result = "0";221 returnresult;222 }223

224

225 //缺省地,商数向下取整, floatpoint用于指定保留小数点的位数

226 static string DIVIDE(string number1, string number2, int floatpoint = 0)227 {228 inti, j, pos;229 string result = "";230 string tempstr = "";231 int length1 =number1.size();232 int length2 =number2.size();233

234 if((COMPARE(number2, number1) > 0) && (floatpoint == 0))235 {236 return "0";237 }238

239 tempstr = number1.substr(0, length2);240 pos = length2 - 1;241

242 while(pos = 0)246 {247 quotient++;248 tempstr =MINUS(tempstr, number2);249 }250

251 result = result + (char)(quotient + 48);252 pos++;253 if(pos

259 if(floatpoint > 0)260 {261 result += ‘.‘;262 string stmp = "1";263 int itmp = 0;264 for(int k = 0; k < floatpoint; ++k)265 {266 stmp += ‘0‘;267 if(COMPARE(MULTIPLY(MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2)), stmp), number2) < 0)268 {269 result += ‘0‘;270 ++itmp;271 }272 }273

274 string temp =DIVIDE(MULTIPLY(MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2)), stmp), number2);275 if(temp[0] != ‘0‘) result +=temp;276 }277

278 j =result.size();279 for(i = 0; i < j; i++)280 {281 if(result[i] != ‘0‘) break;282 }283

284 result =result.substr(i, j);285

286 returnresult;287 }288

289 staticstring MOD(string number1, string number2)290 {291 if(COMPARE(number2, number1) > 0)292 {293 returnnumber1;294 }295 else if(COMPARE(number2, number1) == 0)296 {297 return "0";298 }299 else

300 {301 returnMINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2));302 }303 }304 };305

306 int main(int argc, char*argv[])307 {308 string str1 = "9999999999999999999999999999999999999999";309 string str2 = "9998999899989998999899989998999899989998";310

311 cout << BIGINTEGEROPERATIONS::PLUS(str1, str2) <

321 return 0;322 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值