Abbreviating the Product of a Range LeetCode solution in C++

1
class Solution {
2
public:
3
string abbreviateProduct(int left, int right) {
4
// upper 12 digit of product
5
double upper = 1;
6

7
// lower 12 digit of product
8
long long lower = 1L;
9

10
// offset to make 12 digit in upper and lower
11
long long Offset = 1e12;
12

13
// offset to make 5 digit in upper and lower
14
long long cutOffset = 1e5;
15

16
// store log value of the product
17
double product = 0.0;
18

19
// count trailing zero in the product
20
int trailing = 0;
21

22
for (int i = left; i <= right; i++) {
23
// update log value of product
24
product += log10(i);
25

26
// multiple value with upper and lower 12 digit
27
upper *= i;
28
lower *= i;
29

30
// keep 12 digit in upper
31
while (upper >= Offset) upper /= 10;
32

33
// remove trailing zeroes
34
while (lower % 10 == 0) lower /= 10, trailing++;
35

36
// keep 12 digits in lower
37
lower %= Offset;
38
}
39

40
// count total digits in product except trailing zeroes
41
int digitLength = (int)product + 1 - trailing;
42

43
// keep 5 digit in upper and lower
44
while (upper >= cutOffset) upper /= 10;
45
lower %= cutOffset;
46

47
int upperInt = upper;
48

49
// take digit length digits from upper and lower when digit length <= 10
50
if (digitLength <= 10) {
51
// make all digit 0 to tackle missing MSB zeroes in lower
52
string result(digitLength, '0');
53
string upperStr = to_string(upperInt);
54
string lowerStr = to_string(lower);
55

56
for (int i = 0; i < upperStr.length() && digitLength > 0; i++, digitLength--)
57
result[i] = upperStr[i];
58

59
for (int k = 1; !lowerStr.empty() && digitLength > 0; digitLength--, k++) {
60
result[result.length() - k] = lowerStr.back();
61
lowerStr.pop_back();
62
}
63

64
return result + "e" + to_string(trailing);
65
} else {
66
// take upper and lower 5 digits
67
string result = to_string(lower);
68
return to_string(upperInt) + "..." + string(5 - result.size(), '0') + result + "e" +
69
to_string(trailing);
70
}
71
}
72
};

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0