#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
static inline int stringPartCompare(const string* s1, const string* s2, unsigned long length) {
int diff;
for (unsigned long i = 0; i < length; i++) {
diff = s1->at(i) - s2->at(i);
if (diff == 0) continue;
return diff;
}
return 0;
}
static inline void appendZeros(string* s, unsigned long length) {
s->resize(s->size() + length, '0');
}
static inline int increment(string* s, unsigned long startPos) {
for (long long i = s->size() - 1; i >= startPos; i--) {
if (s->at(i) < '9') {
s->at(i)++;
return 0;
}
s->at(i) = '0';
}
appendZeros(s, 1);
return 1;
}
int main(void) {
unsigned long long result = 0;
int n;
string s1, s2;
string *prev = &s1, *current = &s2;
long long sizeDiff;
int commonPartDiff;
cin >> n;
cin >> *current;
for (int i = 1; i < n; i++) {
swap(current, prev);
cin >> *current;
sizeDiff = prev->size() - current->size();
if (sizeDiff > 0) {
commonPartDiff = stringPartCompare(prev, current, current->size());
if (commonPartDiff == 0) {
swap(current, prev);
result += sizeDiff + increment(current, prev->size());
} else {
if (commonPartDiff > 0) sizeDiff++;
appendZeros(current, sizeDiff);
result += sizeDiff;
}
} else if (sizeDiff == 0) {
if (stringPartCompare(prev, current, current->size()) >= 0) {
appendZeros(current, 1);
result++;
}
}
}
cout << result;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; static inline int stringPartCompare(const string* s1, const string* s2, unsigned long length) { int diff; for (unsigned long i = 0; i < length; i++) { diff = s1->at(i) - s2->at(i); if (diff == 0) continue; return diff; } return 0; } static inline void appendZeros(string* s, unsigned long length) { s->resize(s->size() + length, '0'); } static inline int increment(string* s, unsigned long startPos) { for (long long i = s->size() - 1; i >= startPos; i--) { if (s->at(i) < '9') { s->at(i)++; return 0; } s->at(i) = '0'; } appendZeros(s, 1); return 1; } int main(void) { unsigned long long result = 0; int n; string s1, s2; string *prev = &s1, *current = &s2; long long sizeDiff; int commonPartDiff; cin >> n; cin >> *current; for (int i = 1; i < n; i++) { swap(current, prev); cin >> *current; sizeDiff = prev->size() - current->size(); if (sizeDiff > 0) { commonPartDiff = stringPartCompare(prev, current, current->size()); if (commonPartDiff == 0) { swap(current, prev); result += sizeDiff + increment(current, prev->size()); } else { if (commonPartDiff > 0) sizeDiff++; appendZeros(current, sizeDiff); result += sizeDiff; } } else if (sizeDiff == 0) { if (stringPartCompare(prev, current, current->size()) >= 0) { appendZeros(current, 1); result++; } } } cout << result; return 0; } |
English