#include <iostream>
#include <iomanip>
using namespace std;
// Let's see if this works !!!
// (After all, I might have screwed up somewhere, so there's no guarantees!)
unsigned int sqrtOfLong(unsigned long x) {
// inspired by https://w...content-available-to-author-only...e.com/watch?v=haaCoVrGd6k
unsigned long leftover = x;
unsigned long leftoverStep = 0UL;
unsigned long result = 0UL;
unsigned long resultStep = 0x40000000UL;
do {
leftoverStep >>= 1;
result >>= 1;
if ((leftoverStep + resultStep) <= leftover) {
leftoverStep += resultStep;
leftover -= leftoverStep;
result += resultStep;
leftoverStep += resultStep;
}
resultStep >>= 2;
} while (resultStep);
return ((unsigned int)result);
}
int main() {
unsigned long ok = 0;
unsigned long ng = 0;
for (unsigned long i = 0; i <= 30; i++) {
unsigned long qu = i * i;
unsigned int rt = sqrtOfLong(qu);
cout << setw(5) << i << " " << setw(5) << qu << " " << setw(5) << rt << "\n";
if (i == rt) {
ok++;
}
else {
ng++;
}
cout << "\n";
qu += (2*i);
rt = sqrtOfLong(qu);
cout << setw(5) << i << " " << setw(5) << qu << " " << setw(5) << rt << "\n";
if (i == rt) {
ok++;
}
else {
ng++;
}
}
cout << "\n";
cout << "OK: " << ok << "\n";
cout << "NG: " << ng << "\n";
// your code goes here
return 0;
}