File tree 1 file changed +97
-0
lines changed
Codes/Algorithm/mathematic/c++/cases/numbers
1 file changed +97
-0
lines changed Original file line number Diff line number Diff line change
1
+ /*
2
+ Root Simplification
3
+ Archive of Reversing.ID
4
+ Algorithm (Mathematics/Numbers)
5
+
6
+ Compile:
7
+ [clang]
8
+ $ clang++ root-simplification.cpp -o root-simplification
9
+
10
+ [gcc]
11
+ $ g++ root-simplification.cpp -o root-simplification
12
+
13
+ [msvc]
14
+ $ cl root-simplification.cpp
15
+
16
+ Run:
17
+ $ root-simplification
18
+ */
19
+ #include < tuple>
20
+ #include < cmath>
21
+
22
+ /*
23
+ Menyederhanakan bilangan akar √X Menjadi bentuk perfect dan radicand C√D
24
+
25
+ √A = B√C
26
+ A = num
27
+ B = perfect number
28
+ C = radicand
29
+
30
+ Contoh:
31
+ √20 = 2√5
32
+ √56 = 3√7
33
+
34
+ berlaku juga untuk akar lain (akar pangkat 3, akar pangkat 4, dsb).
35
+ */
36
+
37
+ // ======================================================================================
38
+
39
+ /*
40
+ Iterative Solution
41
+ Melakukan faktorisasi, mencari faktor-faktor prima dari bilangan dan membangun
42
+ perfect number dan radicand di setiap iterasi.
43
+ */
44
+
45
+ auto algorithm (size_t num, size_t degree)
46
+ {
47
+ size_t power = 0 ;
48
+ size_t number = 2 ;
49
+
50
+ size_t perfect = 1 , radicand = 1 ;
51
+
52
+ // proses faktor 2 sebagai satu-satunya faktor prima genap.
53
+ power = 0 ;
54
+ while (num % 2 == 0 )
55
+ {
56
+ num = num / 2 ;
57
+
58
+ power ++;
59
+ if (power == degree)
60
+ {
61
+ power = 0 ;
62
+ perfect *= 2 ;
63
+ }
64
+ }
65
+
66
+ for (size_t j = 0 ; j < power; j++)
67
+ radicand *= 2 ;
68
+
69
+ // proses faktor prima dimulai dari 3
70
+ for (size_t i = 3 , batas = sqrt (num); i <= batas; i += 2 )
71
+ {
72
+ power = 0 ;
73
+
74
+ // mendapatkan bernilai sama
75
+ while (num % i == 0 )
76
+ {
77
+ num = num / i;
78
+
79
+ power++;
80
+ if (power == degree)
81
+ {
82
+ power = 0 ;
83
+ perfect *= i;
84
+ }
85
+ }
86
+
87
+ for (size_t j = 0 ; j < power; j++)
88
+ radicand *= i;
89
+ }
90
+
91
+ // jika ada faktor yang lebih besar daripada sqrt(num)
92
+ if (num > 2 )
93
+ radicand *= num;
94
+
95
+ // get<0> -> perfect, get<0> -> radicand
96
+ return std::make_tuple (perfect, radicand);
97
+ }
You can’t perform that action at this time.
0 commit comments