質問するログイン新規登録

回答編集履歴

1

追記

2020/05/23 14:06

投稿

退会済みユーザー
answer CHANGED
@@ -5,4 +5,68 @@
5
5
  ・計算可能な桁数(例えば5桁づつ)ごと配列に分けて計算する
6
6
  ・桁上がりを自力で処理する
7
7
  ・べき乗は単純な掛け算の繰り返しである(ループで処理できる)
8
- というように、細かい要素に分けてやれば可能ですよね。
8
+ というように、細かい要素に分けてやれば可能ですよね。
9
+
10
+ ---
11
+ 参考例として。
12
+ ちなみに、C#で適当に書くとこんなんなります。(速度とか効率はとりあえず置いときます)
13
+ ```C#
14
+ int n = 79; //とりあえずnの最大を与える
15
+ int powX = 3;
16
+ int powY = 1;
17
+ BigInteger val = powX; //出力する数を格納する変数
18
+
19
+ while (true)
20
+ {
21
+ //次のBigIntegerの桁数を計算する
22
+ //Log10(valNext)+1=80(桁数80)に達した時点で、valに79桁の最大の数が格納されている
23
+ var valNext = BigInteger.Pow(powX, powY);
24
+ if (((int)BigInteger.Log10(valNext) + 1) > n)
25
+ {
26
+ break;
27
+ }
28
+ val = valNext;
29
+ powY++; //べき乗する値を加算
30
+ }
31
+
32
+ //コンソールに文字列を出力
33
+ Console.WriteLine(val.ToString());
34
+ ```
35
+ C#なんて判らん!となるでしょうが、これをC言語の機能に置き換えると、
36
+ 0. 大きい数を扱う構造体(BigIntegerを置き換える)
37
+ 0. 上記構造体をべき乗(乗算)する関数(BigInteger.Powを置き換える)
38
+ 0. 上記構造体の桁数を計算する関数(BigInteger.Log10+1を置き換える)
39
+ 0. 上記構造体を文字列に変換する関数(val.ToString()を置き換える)
40
+
41
+ を用意すると、同等の機能を実現できます。
42
+
43
+ ```C
44
+ typedef struct BigInt
45
+ {
46
+ int Values[20];
47
+ } BigInt;
48
+
49
+ int main()
50
+ {
51
+ char buf[100];
52
+ int n = 79;
53
+ int powX = 3;
54
+ int powY = 1;
55
+ BigInt val = { powX };
56
+
57
+ while (true)
58
+ {
59
+ BigInt valNext = BigPow(powX, powY);
60
+ if (BigIntLength(valNext) > n)
61
+ {
62
+ break;
63
+ }
64
+ val = valNext;
65
+ powY++;
66
+ }
67
+
68
+ BigIntToString(buf, val);
69
+ printf("%s\r\n", buf);
70
+ return 0;
71
+ }
72
+ ```