To check the speed of JCN Corporation new supercomputer it was decided to figure out the sum of first N (N<10600)positive integers. Unfortunately, by the time the calculation wasfinished the Chief Programmer forgot the value of N he entered.Your task is to write the program (for personal computer), which woulddetermine the value of N by the result calculated on supercomputer.
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹Note:
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹JCN Corporation manufactures only reliable computers, and its programmers write only correctly working programs.
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹InputOne line containing number M - the result of calculations on supercomputer.
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹OutputOne line, containing N - number, entered by Chef Programmer.
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹Sample
Problem Author: Eugene Bryzgalov
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹Problem Source: Ural Collegiate Programming Contest, April 2001, Perm, English Tour答案如下:
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹ 1 using System;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
2 using System.Globalization;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
3 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
4 namespace Skyiv.Ben.Timus:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
5 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
6 // [url]http://acm.timus.ru/problem.aspx?space=1&num=1153[/url]:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
7 sealed class T1153:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
8 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
9 static void Main():ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
10 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
11 BigInteger m = BigInteger.Parse(Console.ReadLine());:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
12 Console.WriteLine(BigInteger.Sqrt(m + m));:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
13 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
14 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
15 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
16 sealed class BigInteger : IComparable<BigInteger>:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
17 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
18 int[] digits = new int[601];:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
19 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
20 public BigInteger(int n):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
21 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
22 digits[0] = n;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
23 if (digits[0] > 9) Format();:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
24 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
25 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
26 public BigInteger(BigInteger x):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
27 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
28 Array.Copy(x.digits, digits, digits.Length);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
29 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
30 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
31 public static BigInteger Parse(string s):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
32 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
33 BigInteger x = new BigInteger(0);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
34 for (int i = s.Length - 1; i >= 0; i--) x.digits[s.Length - 1 - i] = s[i] - '0';:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
35 return x;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
36 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
37 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
38 public int CompareTo(BigInteger x):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
39 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
40 for (int i = digits.Length - 1; i >= 0; i--):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
41 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
42 if (digits[i] > x.digits[i]) return 1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
43 else if (digits[i] < x.digits[i]) return -1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
44 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
45 return 0;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
46 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
47 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
48 public static BigInteger Sqrt(BigInteger x):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
49 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
50 BigInteger low, high;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
51 GetLowAndHigh(x, out low, out high);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
52 BigInteger mid = low;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
53 int cmp = 0;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
54 while (low.CompareTo(high) <= 0):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
55 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
56 mid = (low + high) / 2;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
57 cmp = (mid * mid).CompareTo(x);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
58 if (cmp < 0) low = mid + 1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
59 else if (cmp > 0) high = mid + (-1);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
60 else return mid;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
61 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
62 if (cmp > 0) mid = mid + (-1);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
63 return mid;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
64 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
65 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
66 static void GetLowAndHigh(BigInteger x, out BigInteger low, out BigInteger high):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
67 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
68 int xmax = x.digits.Length - 1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
69 while (xmax >= 0 && x.digits[xmax] == 0) xmax--;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
70 const int doublePrecison = 15;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
71 if (xmax < doublePrecison):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
72 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
73 low = high = new BigInteger((int)Math.Sqrt(GetPrefix(x, xmax, doublePrecison)));:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
74 return;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
75 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
76 int zeros = xmax - doublePrecison + 1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
77 if (zeros % 2 != 0) zeros++;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
78 string[] ss = Math.Sqrt(GetPrefix(x, xmax, xmax - zeros + 1)).ToString("F8", CultureInfo.InvariantCulture).Split('.');:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
79 low = new BigInteger(0);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
80 zeros /= 2;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
81 int j = 1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
82 for (int i = 0; i < ss[0].Length; i++) low.digits[i + zeros] = ss[0][ss[0].Length - 1 - i] - '0';:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
83 for (int i = 0; i < ss[1].Length - 2 && j <= zeros; i++, j++) low.digits[zeros - j] = ss[1][i] - '0';:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
84 high = new BigInteger(low);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
85 if (++high.digits[zeros - j + 1] > 9) high.Format();:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
86 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
87 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
88 static long GetPrefix(BigInteger x, int start, int length):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
89 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
90 long v = 0;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
91 for (int i = start; i >= 0 && length > 0; i--, length--) v = v * 10 + x.digits[i];:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
92 return v;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
93 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
94 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
95 public static BigInteger operator +(BigInteger x, int y):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
96 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
97 BigInteger z = new BigInteger(x);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
98 z.digits[0] += y;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
99 if (z.digits[0] > 9 || z.digits[0] < 0) z.Format();:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
100 return z;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
101 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
102 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
103 public static BigInteger operator +(BigInteger x, BigInteger y):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
104 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
105 BigInteger z = new BigInteger(x);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
106 for (int i = x.digits.Length - 1; i >= 0; i--) z.digits[i] = x.digits[i] + y.digits[i];:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
107 z.Format();:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
108 return z;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
109 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
110 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
111 public static BigInteger operator *(BigInteger x, BigInteger y):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
112 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
113 BigInteger z = new BigInteger(0);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
114 int xmax = x.digits.Length - 1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
115 int ymax = y.digits.Length - 1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
116 while (xmax >= 0 && x.digits[xmax] == 0) xmax--;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
117 while (ymax >= 0 && y.digits[ymax] == 0) ymax--;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
118 for (int xi = xmax; xi >= 0; xi--):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
119 for (int yi = ymax; yi >= 0; yi--):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
120 z.digits[xi + yi] += x.digits[xi] * y.digits[yi];:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
121 z.Format();:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
122 return z;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
123 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
124 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
125 public static BigInteger operator /(BigInteger x, int y):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
126 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
127 BigInteger z = new BigInteger(0);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
128 int xmax = x.digits.Length - 1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
129 while (xmax >= 0 && x.digits[xmax] == 0) xmax--;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
130 for (int remainder = 0, i = xmax; i >= 0; i--):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
131 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
132 int quotient = 10 * remainder + x.digits[i];:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
133 remainder = quotient % y;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
134 z.digits[i] = quotient / y;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
135 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
136 return z;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
137 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
138 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
139 void Format():ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
140 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
141 for (int quotient = 0, i = 0; i < digits.Length; i++):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
142 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
143 int numerator = digits[i] + quotient;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
144 quotient = numerator / 10;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
145 int remainder = numerator % 10;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
146 if (remainder < 0):ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
147 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
148 remainder += 10;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
149 quotient--;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
150 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
151 digits[i] = remainder;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
152 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
153 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
154 :ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
155 public override string ToString():ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
156 {:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
157 int n = digits.Length - 1;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
158 while (n >= 0 && digits[n] == 0) n--;:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
159 if (n < 0) return "0";:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
160 char[] cs = new char[n + 1];:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
161 for (int i = n; i >= 0; i--) cs[i] = (char)(digits[n - i] + '0');:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
162 return new string(cs);:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
163 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
164 }:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹
165 }
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹我们知道,自然数列的前 N 项和 M = N * ( N + 1 ) / 2 ≈ N2 / 2。所以 N = [ sqrt( 2 * M ) ]。这里 [x] 表示对 x 进行下取整。
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹这个程序的关键就是求 BigInteger 的平方根。本程序中第 66 到 86 行的 GetLowAndHigh() 方法估算出平方根的范围,然后在第 48 到 64 行的 Sqrt() 方法中用二分查找法找出所求的平方根。
:ÁAî%÷îÌwww.netcsharp.cn«1IècQ¹