2012年4月15日

大数加、减、乘法

 

 

比上次的好了很多了,可以进行正负数的加减乘法运算

不过还是有些bug(主要bug是输入时数字前面不能有0)

并且这些bug还导致了除法不能正确运算出……

 

View Code
  1 package BigNumber;
  2 
  3 public class BigNumber {
  4 
  5     BigNumber() {
  6         num = "";
  7         leng = 0;
  8         flag = false;
  9     }
 10 
 11     BigNumber(String str) {
 12         num = str.trim();
 13         if (str.charAt(0) == '-') {
 14             flag = true;// -
 15             num = num.substring(1);
 16         } else {
 17             flag = false;// +
 18             if (str.charAt(0) == '+') {
 19                 num = num.substring(1);
 20             }
 21         }
 22         leng = str.length();
 23     }
 24 
 25     BigNumber(int arr[]) {// 不建议使用数组初始化
 26         num = "";
 27         add(arr);
 28         flag = false;
 29         leng = num.length();
 30     }
 31 
 32     /*
 33      * private BigNumber(int arr[], int Flag) { num = ""; add(arr); if (Flag ==
 34      * 0) flag = false; else flag = true; leng = arr.length; }
 35      */
 36     BigNumber(int x) {
 37         if (x < 0) {
 38             flag = true;
 39             x *= -1;
 40         } else
 41             flag = false;
 42         int len = 0, temp = x;
 43         while (temp != 0) {
 44             len++;
 45             temp /= 10;
 46         }
 47         if (x == 0) {
 48             num = "";
 49             add("0");
 50         } else {
 51             int[] arr = new int[len];
 52             while (len != 0) {
 53                 len--;
 54                 arr[len] = x % 10;
 55                 x /= 10;
 56             }
 57             num = "";
 58             add(arr);
 59         }
 60     }
 61 
 62     public int length() {
 63         leng = num.length();
 64         return leng;
 65     }
 66 
 67     public void print() {
 68         if (flag == true && num.compareTo("0") != 0)
 69             System.out.print("-");
 70         System.out.print(num);
 71     }
 72 
 73     public void println() {
 74         print();
 75         System.out.println("");
 76     }
 77 
 78     public void add(String str) {
 79         num += str;
 80     }
 81 
 82     public void add(int Num[]) {
 83         String str = "";
 84         for (int i = 0; i < Num.length; i++) {
 85             str += Num[i];
 86         }
 87         num += str;
 88     }
 89 
 90     public BigNumber plus(BigNumber Num) {
 91         BigNumber ans = new BigNumber();
 92 
 93         if (flag == Num.flag)
 94             ans.flag = flag;
 95         else if (flag == false) {
 96             Num.flag = false;
 97             ans = minus(Num);
 98             Num.flag = true;
 99             return ans;
100         } else {
101             flag = false;
102             ans = Num.minus(this);
103             flag = true;
104             return ans;
105         }
106 
107         int len1 = this.length();
108         int len2 = Num.length();
109         int nth = (len1 > len2) ? len1 : len2;
110         int[] temp = new int[nth];
111         int i, d;
112         for (i = 1, d = 0; i <= len1 && i <= len2; i++) {
113             temp[nth - i] = (d + num.charAt(len1 - i)
114                     + Num.num.charAt(len2 - i) - '0' - '0') % 10;
115             d = (d + num.charAt(len1 - i) + Num.num.charAt(len2 - i) - '0' - '0') / 10;
116         }
117         for (; i <= len1; i++) {
118             temp[nth - i] = (d + num.charAt(len1 - i) - '0') % 10;
119             d = (d + num.charAt(len1 - i) - '0') / 10;
120         }
121         for (; i <= len2; i++) {
122             temp[nth - i] = (d + Num.num.charAt(len2 - i) - '0') % 10;
123             d = (d + Num.num.charAt(len2 - i) - '0') / 10;
124         }
125         if (d != 0)
126             ans.num = "" + d;
127         ans.add(temp);
128         return ans;
129     }
130 
131     public BigNumber plus(String str) {
132         BigNumber temp = new BigNumber(str);
133         return this.plus(temp);
134     }
135 
136     public BigNumber plus(int x) {
137         BigNumber temp = new BigNumber(x);
138         return this.plus(temp);
139     }
140 
141     public BigNumber plus(int arr[]) {
142         BigNumber temp = new BigNumber(arr);
143         return this.plus(temp);
144     }
145 
146     public BigNumber minus(BigNumber Num) {
147         BigNumber ans = new BigNumber();
148         String str1, str2;
149 
150         if (flag != Num.flag) {
151             Num.flag = flag;
152             ans = plus(Num);
153             Num.flag = (flag == true) ? false : true;
154             return ans;
155         }
156 
157         if (this.length() > Num.length()) {
158             str1 = num;
159             str2 = Num.getNum();
160             ans.flag = flag;
161         } else if (this.length() < Num.length()) {
162             str2 = num;
163             str1 = Num.getNum();
164             ans.flag = (flag == true) ? false : true;
165         } else if (this.num.compareTo(Num.getNum()) < 0) {
166             str2 = num;
167             str1 = Num.getNum();
168             ans.flag = (flag == true) ? false : true;
169         } else {
170             str1 = num;
171             str2 = Num.getNum();
172             ans.flag = flag;
173         }
174 
175         int len1 = str1.length(), len2 = str2.length();
176         int i, d;
177         int[] temp = new int[len1];
178         for (i = 1, d = 0; i <= len2; i++) {
179             temp[len1 - i] = str1.charAt(len1 - i) - d - str2.charAt(len2 - i);
180             if (temp[len1 - i] < 0) {
181                 d = 1;
182                 temp[len1 - i] += 10;
183             } else {
184                 d = 0;
185             }
186         }
187         for (; i <= len1; i++) {
188             temp[len1 - i] = str1.charAt(len1 - i) - d - '0';
189             if (temp[len1 - i] < 0) {
190                 d = 1;
191                 temp[len1 - i] += 10;
192             } else {
193                 d = 0;
194             }
195         }
196         ans.add(temp);
197         return ans;
198     }
199 
200     public BigNumber minus(String str) {
201         BigNumber temp = new BigNumber(str);
202         return this.minus(temp);
203     }
204 
205     public BigNumber minus(int x) {
206         BigNumber temp = new BigNumber(x);
207         return this.minus(temp);
208     }
209 
210     public BigNumber minus(int arr[]) {
211         BigNumber temp = new BigNumber(arr);
212         return this.minus(temp);
213     }
214 
215     public BigNumber multip(BigNumber Num) {
216         BigNumber temp = new BigNumber();
217         int nth, d, x;
218         int[] arr = new int[leng];
219         for (nth = 0; nth < Num.getNum().length(); nth++) {
220             x = Num.getNum().charAt(nth) - '0';
221             d = 0;
222             for (int i = 1; i <= leng; i++) {
223                 arr[leng - i] = ((num.charAt(leng - i) - '0') * x + d) % 10;
224                 d = ((num.charAt(leng - i) - '0') * x + d) / 10;
225             }
226             BigNumber bb = new BigNumber();
227             if (d != 0) {
228                 bb = new BigNumber(d);
229             }
230             bb.add(arr);
231             if (temp.length() != 0) {
232                 temp.add("0");
233             }
234             temp = temp.plus(bb);
235         }
236         temp.flag = (this.flag == Num.flag) ? false : true;
237         return temp;
238     }
239 
240     public BigNumber multip(String str) {
241         BigNumber temp = new BigNumber(str);
242         return this.multip(temp);
243     }
244 
245     public BigNumber multip(int x) {
246         BigNumber temp = new BigNumber(x);
247         return this.multip(temp);
248     }
249 
250     public BigNumber multip(int arr[]) {
251         BigNumber temp = new BigNumber(arr);
252         return this.multip(temp);
253     }
254 
255     public String getNum() {
256         return num;
257     }
258 
259     private String num;
260     public boolean flag;
261     private int leng;
262 }

 

posted @ 2012-04-15 23:15 laymond 阅读(7) 评论(0) 编辑

2012年3月25日

大数相加 java

import java.util.*;

public class myJava {
	public static void main(String[] ags) {
		Scanner console = new Scanner(System.in);
		String str1, str2;
		str1 = console.nextLine();
		str2 = console.nextLine();
		bigNumber num1 = new bigNumber(str1);
		bigNumber num2 = new bigNumber(str2);
		num1.add(num2).print();
	}
}

class bigNumber {
	bigNumber(int str[]) {
		int len = str.length;
		int i, j;

		for (i = 0; str[i] == 0 && i < len; ++i)//去前缀0
			;
		
		if( i == len )//当为0的时候的处理,但不知道为什么好像没起到应有的作用
		{
			this.num = new int[1];
			this.num[0] = 0;
		}
		else
			this.num = new int[len - i];

		for (j = 0; i < len; ++i, ++j) {
			this.num[j] = str[i];
		}
	}

	bigNumber(String str) {
		int len = str.length();
		int i, j;

		for (i = 0; str.codePointAt(i) == '0' && i < len; ++i)//去前缀0
			;

		if( i == len )//当为0的时候的处理,但不知道为什么好像没起到应有的作用
		{
			this.num = new int[1];
			this.num[0] = 0;
		}
		else
			this.num = new int[len - i];

		for (j = 0; i < len; ++i, ++j) {
			num[j] = str.codePointAt(i) - '0';
		}
	}

	public bigNumber add(bigNumber num2) {
		int len1 = this.num.length;
		int len2 = num2.num.length;
		int mostLen = (len1 > len2) ? len1 : len2;
		int[] sum = new int[mostLen + 1];
		int temp;
		for (temp = 0, --len1, --len2; len1 >= 0 && len2 >= 0; --len1, --len2, --mostLen) {//从个位开始相加
			sum[mostLen] = (this.num[len1] + num2.num[len2] + temp) % 10;
			temp = (this.num[len1] + num2.num[len2] + temp) / 10;
		}
		for (; len1 >= 0; --len1, --mostLen) {//num中剩余部分
			sum[mostLen] = (this.num[len1] + temp) % 10;
			temp = (this.num[len1] + temp) / 10;
		}
		for (; len2 >= 0; --len2, --mostLen) {//num2.num中的剩余部分
			sum[mostLen] = (num2.num[len2] + temp) % 10;
			temp = (num2.num[len2] + temp) / 10;
		}
		sum[0] = temp;
		bigNumber num3 = new bigNumber(sum);
		return num3;
	}

	public void print() {
		int len = num.length;
		for (int i = 0; i < len; ++i)
			System.out.print(num[i]);
	}

	int[] num;
}


功能:输入两个很大的正整数并相加;

但不知道为什么输入0的时候会出错啊唉。。

哪里不对的,就请狠狠的批吧Orz

posted @ 2012-03-25 22:11 laymond 阅读(190) 评论(0) 编辑

2012年2月5日

hdu 1163 Eddy's digital Roots

http://hi.baidu.com/%CC%DA%D4%C6%BB%AA%CF%C4/blog/item/c27443373248e943251f14da.html

因为ab*ab

= ( 10*a + b )*( 10*a + b )

= 100*a*a + 10*2*a*b + b*b

= a*a + 2*a*b + b*b

= ( a + b )*( a + b )

 

  abc*abc = ( 100*a + 10*b + c )*( 100*a + 10*b + c )

= 10000*a*a + 2000*a*b + 100*b*b + 200*a*c + 20*b*c + c*c

= a*a + 2*a*b + b*b + 2*a*c + 2*b*c + c*c

= ( a + b )^2 + 2*c*( a + b ) + c*c

= ( a + b + c )*( a + b + c )

 

同理可以知道四位数,五位数也一样,

即n*n的数根=n的数根*n的数根

数论当中有个结论:“某数乘积的九余数=等于该数九余数的乘积”当余数为0时,该数为九。

 

 

 

#include <iostream>
using namespace std;

int main( )
{
int n;
while( scanf( "%d", &n ) && n )
{
int i, s = 1;
for( i = 0; i < n; ++ i )
{
s = ( s * n ) % 9;
}
if( s == 0 )
puts( "9" );
else
printf( "%d\n", s );
}
return 0;
}



posted @ 2012-02-05 21:04 laymond 阅读(28) 评论(1) 编辑

hdu 1284 钱币兑换问题

用母函数会超时。

应该计算有几个2和几个3。

#include <iostream>
using namespace std;

int num[40000];

int main()
{
int i, j, k;
for( i = 0; i < 32768; i ++ )
{
num[i] = i / 2 + 1;
}
for( i = 3; i < 32768; i ++ )
{
num[i] = num[i] + num[i-3];
}
while( cin >> i )
cout << num[i] << endl;
return 0;
}

 

posted @ 2012-02-05 15:22 laymond 阅读(93) 评论(2) 编辑