用分治法实现大数乘法,加法,减法(java实现)

  大数乘法即多项式乘法问题,求A(x)与B(x)的乘积C(x),朴素解法的复杂度O(n^2),基本思想是把多项式A(x)与B(x)写成

A(x)=a*x^m+b
B(x)=c*x^m+d

其中a,b,c,d为x的多项式。
则A(x)*B(x)=(ac)*x^2m+(ad+bc)*x^m+bd
由ad+bc=(a+b)(c+d)-ac-bd
原来的4次乘法和1次加法由3次乘法和2次减法代替,减少了一次乘法操作。
用同样的方法应用到abcd的乘法上。

(以上内容摘自互联网)

以下为用java实现的代码:

 

  1 package com.kyy.sf;

  2 

  3 public class BigInteger {

  4 

  5     public BigInteger() {

  6 

  7     }

  8 

  9     // 基本思想是把多项式A(x)与B(x)写成

 10     // A(x)=a*x^m+b

 11     // B(x)=c*x^m+d

 12     // 其中a,b,c,d为x的多项式。

 13     // 则A(x)*B(x)=(ac)*x^2m+(ad+bc)*x^m+bd

 14     // 由ad+bc=(a+b)(c+d)-ac-bd

 15     // 字符串模拟乘法操作

 16     

 17     public static String mut(String x, String y) {

 18         // deep++;// Console.WriteLine("-" + deep + "-");

 19         String negative = "";

 20         // x,y同为正或者同为负

 21         if ((x.startsWith("-") && y.startsWith("-"))

 22                 || (!x.startsWith("-") && !y.startsWith("-"))) {

 23             x = x.replaceAll("-", "");

 24             y = y.replaceAll("-", "");

 25             negative = "";

 26         }// x,y一正一负

 27         else if ((x.startsWith("-") && !y.startsWith("-"))

 28                 || (!x.startsWith("-") && y.startsWith("-"))) {

 29             x = x.replace("-", "");

 30             y = y.replace("-", "");

 31             negative = "-";

 32         }

 33 

 34         // 如果长度都等于于9,直接相乘,返回就行了。

 35         if (x.length() == 1 && y.length() == 1) {

 36             // 计算乘积

 37             int tmp = (Integer.parseInt(x) * Integer.parseInt(y));

 38 

 39             if (tmp == 0) {

 40                 return tmp + "";

 41             } else {

 42                 return negative + tmp;

 43             }

 44         }

 45 

 46         // 公式里的abcd

 47         String a, b, c, d;

 48         if (x.length() == 1) {

 49             a = "0";

 50             b = x;

 51         } else {

 52             if (x.length() % 2 != 0) {

 53                 x = "0" + x;

 54             }

 55             a = x.substring(0, x.length() / 2);

 56             b = x.substring(x.length() / 2);

 57         }

 58         if (y.length() == 1) {

 59             c = "0";

 60             d = y;

 61         } else {

 62             if (y.length() % 2 != 0) {

 63                 y = "0" + y;

 64             }

 65             c = y.substring(0, y.length() / 2);

 66             d = y.substring(y.length() / 2);

 67         }

 68         // 按最大位数取值,以确定补零数目

 69         int n = x.length() >= y.length() ? x.length() : y.length();

 70 

 71         String t1, t2, t3;

 72         // 递归调用,根据公式计算出值。

 73         String ac = mut(a, c);

 74         String bd = mut(b, d);

 75         t1 = mut(sub(a, b), sub(d, c));

 76         t2 = add(add(t1, ac), bd);

 77         t3 = add(add(Power10(ac, n), Power10(t2, n / 2)), bd).replaceAll("^0+",

 78                 "");

 79 

 80         if (t3 == "")

 81             return "0";

 82         return negative + t3;

 83     }

 84 

 85     private static String add(String x, String y) {

 86 

 87         if (x.startsWith("-") && !y.startsWith("-")) {

 88             return sub(y, x.replaceAll("^-", ""));

 89         } else if (!x.startsWith("-") && y.startsWith("-")) {

 90             return sub(x, y.replaceAll("^-", ""));

 91         } else if (x.startsWith("-") && y.startsWith("-")) {

 92             return "-" + add(x.replaceAll("^-", ""), y.replaceAll("^-", ""));

 93         }

 94 

 95         if (x.length() > y.length()) {

 96             y = format(y, x.length(), "0");

 97         } else {

 98             x = format(x, y.length(), "0");

 99         }

100         int[] sum = new int[x.length() + 1];

101 

102         for (int i = x.length() - 1; i >= 0; i--) {

103             int tmpsum = Integer.parseInt(x.charAt(i) + "")

104                     + Integer.parseInt(y.charAt(i) + "") + sum[i + 1];

105             if (tmpsum >= 10) {

106                 sum[i + 1] = tmpsum - 10;

107                 sum[i] = 1;// 表示进位

108             } else {

109                 sum[i + 1] = tmpsum;

110             }

111         }

112 

113         StringBuilder returnvalue = new StringBuilder();

114 

115         for (int i : sum) {

116             returnvalue.append(i);

117         }

118 

119         if (sum[0] == 1) {

120 

121             return returnvalue.toString();

122 

123         } else {

124             return returnvalue.replace(0, 1, "").toString();

125         }

126 

127     }

128 

129     // 字符串模拟减法操作

130     private static String sub(String x, String y) {

131 

132         // x是正数,y也是正数

133         int flag = checkBigger(x, y);

134 

135         if (flag == 0) {

136             return "0";

137         } else if (flag == -1) {

138             String tmp = y;

139             y = x;

140             x = tmp;

141         }

142         // 保证了x>=y

143         y = format(y, x.length(), "0");// y补0与x对齐

144 

145         int[] difference = new int[x.length()];

146 

147         for (int i = x.length() - 1; i >= 0; i--) {

148 

149             int tmpdifference;

150 

151             tmpdifference = Integer.parseInt(x.charAt(i) + "")

152                     - Integer.parseInt(y.charAt(i) + "") + difference[i];

153 

154             if (tmpdifference < 0) {

155 

156                 tmpdifference += 10;

157                 difference[i - 1] = -1;// 表示进位

158             }

159 

160             difference[i] = tmpdifference;

161         }

162 

163         StringBuilder returnvalue = new StringBuilder();

164 

165         for (int i : difference) {

166             returnvalue.append(i);

167         }

168 

169         String rv = returnvalue.toString().replaceAll("^0+", "");

170 

171         if ("".equals(rv)) {

172             return "0";

173         }

174 

175         if (flag == -1) {

176             rv = "-" + rv;

177         }

178 

179         return rv;

180     }

181 

182     // 比较大小

183     private static int checkBigger(String x, String y) {

184 

185         if (x.length() > y.length()) {

186 

187             return 1;

188 

189         } else if (x.length() < y.length()) {

190 

191             return -1;

192 

193         } else {

194 

195             for (int i = 0; i < x.length(); i++) {

196 

197                 if (x.charAt(i) > y.charAt(i)) {

198 

199                     return 1;

200 

201                 } else if (x.charAt(i) < y.charAt(i)) {

202                     return -1;

203                 }

204             }

205 

206             return 0;

207         }

208     }

209 

210     //数据前补零

211     private static String format(String str, int len, String fu) {

212 

213         len = len - str.length();

214 

215         for (int i = 0; i < len; i++) {

216 

217             str = fu + str;

218         }

219 

220         return str;

221 

222     }

223 

224     // 模拟移位

225     public static String Power10(String num, int n) {

226 

227         for (int i = 0; i < n; i++) {

228             

229             num += "0";

230         

231         }

232 

233         return num;

234     }

235 

236     public static void main(String[] args) {

237 

238         String x = "93859048059849086850986804750894758903278473894578397598475984784857487584758094875890475984955624146039530798877974";

239         String y = "224343444859408590475847538946";

240         System.out.println(mut(x, y));

241         

242         System.out.println(mut("1111111111", "1111111111"));

243 

244     }

245 }

 

 

 

你可能感兴趣的:(java实现)