/******************************************************************************
Online C Compiler.
Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdio.h>
#include "stdint.h"
uint32_t int_sqrt(uint32_t x) {
if (x < 2) return x;
uint32_t left = 0, right = x / 2 + 1;
uint32_t mid, square;
while (left <= right) {
mid = (left + right) / 2;
square = mid * mid;
if (square == x) {
return mid;
} else if (square < x) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return right;
}
uint32_t int_sqrt2(uint32_t x) {
if (x < 2) return x;
uint32_t res = x;
uint32_t temp;
// Метод Ньютона
while (1) {
temp = (res + x / res) / 2;
if (temp >= res) {
break;
}
res = temp;
}
return res;
}
uint32_t int_sqrt3(uint32_t x) {
if (x < 2) return x;
// Начальное приближение: половина x
uint32_t res = x >> 1;
// Если x меньше 4, нужно вернуть 1
if (res == 0) return 1;
// Метод Ньютона с оптимизированным начальным приближением
while (1) {
uint32_t temp = (res + x / res) >> 1;
if (temp >= res) {
break;
}
res = temp;
}
return res;
}
uint32_t sqrtInt32(uint32_t n) {
int32_t ret = 0;
int32_t s;
int32_t ret_sq = -n - 1;
for (s = 30; s >= 0; s -= 2) {
int32_t b;
ret += ret;
b = ret_sq + ((2 * ret + 1) << s);
if (b < 0) {
ret_sq = b;
ret++;
}
}
return ret;
}
uint32_t int_sqrt4(uint32_t x) {
if (x < 2) return x;
// Магическое начальное приближение
uint32_t res = x;
if (x > 0xFFFF) res = (x >> 16) + 1;
else if (x > 0xFF) res = (x >> 8) + 1;
else if (x > 0xF) res = (x >> 4) + 1;
else res = (x >> 1) + 1;
// Одна итерация Ньютона
res = (res + x / res) >> 1;
// Вторая итерация (можно убрать, если нужна супер-скорость, но точность будет ниже)
res = (res + x / res) >> 1;
return res;
}
int main()
{
uint16_t i,j;
uint32_t sqrt, res;
for(j=0;j<6000;j++)
for(i=0;i<4095;i++){
sqrt = i;
sqrt = sqrt * sqrt;
res = sqrtInt32(sqrt);
if(i != res){
printf("error %d res %d\n\r",i,res);
j=1000;
break;
}
}
printf("Hello World");
return 0;
}
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubGluZSBDIENvbXBpbGVyLgogICAgICAgICAgICAgICAgQ29kZSwgQ29tcGlsZSwgUnVuIGFuZCBEZWJ1ZyBDIHByb2dyYW0gb25saW5lLgpXcml0ZSB5b3VyIGNvZGUgaW4gdGhpcyBlZGl0b3IgYW5kIHByZXNzICJSdW4iIGJ1dHRvbiB0byBjb21waWxlIGFuZCBleGVjdXRlIGl0LgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSAic3RkaW50LmgiCgp1aW50MzJfdCBpbnRfc3FydCh1aW50MzJfdCB4KSB7CiAgICBpZiAoeCA8IDIpIHJldHVybiB4OwoKICAgIHVpbnQzMl90IGxlZnQgPSAwLCByaWdodCA9IHggLyAyICsgMTsKICAgIHVpbnQzMl90IG1pZCwgc3F1YXJlOwoKICAgIHdoaWxlIChsZWZ0IDw9IHJpZ2h0KSB7CiAgICAgICAgbWlkID0gKGxlZnQgKyByaWdodCkgLyAyOwogICAgICAgIHNxdWFyZSA9IG1pZCAqIG1pZDsKCiAgICAgICAgaWYgKHNxdWFyZSA9PSB4KSB7CiAgICAgICAgICAgIHJldHVybiBtaWQ7CiAgICAgICAgfSBlbHNlIGlmIChzcXVhcmUgPCB4KSB7CiAgICAgICAgICAgIGxlZnQgPSBtaWQgKyAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJpZ2h0ID0gbWlkIC0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHJpZ2h0Owp9Cgp1aW50MzJfdCBpbnRfc3FydDIodWludDMyX3QgeCkgewogICAgaWYgKHggPCAyKSByZXR1cm4geDsKCiAgICB1aW50MzJfdCByZXMgPSB4OwogICAgdWludDMyX3QgdGVtcDsKCiAgICAvLyDQnNC10YLQvtC0INCd0YzRjtGC0L7QvdCwCiAgICB3aGlsZSAoMSkgewogICAgICAgIHRlbXAgPSAocmVzICsgeCAvIHJlcykgLyAyOwogICAgICAgIGlmICh0ZW1wID49IHJlcykgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmVzID0gdGVtcDsKICAgIH0KCiAgICByZXR1cm4gcmVzOwp9CgoKdWludDMyX3QgaW50X3NxcnQzKHVpbnQzMl90IHgpIHsKICAgIGlmICh4IDwgMikgcmV0dXJuIHg7CgogICAgLy8g0J3QsNGH0LDQu9GM0L3QvtC1INC/0YDQuNCx0LvQuNC20LXQvdC40LU6INC/0L7Qu9C+0LLQuNC90LAgeAogICAgdWludDMyX3QgcmVzID0geCA+PiAxOwoKICAgIC8vINCV0YHQu9C4IHgg0LzQtdC90YzRiNC1IDQsINC90YPQttC90L4g0LLQtdGA0L3Rg9GC0YwgMQogICAgaWYgKHJlcyA9PSAwKSByZXR1cm4gMTsKCiAgICAvLyDQnNC10YLQvtC0INCd0YzRjtGC0L7QvdCwINGBINC+0L/RgtC40LzQuNC30LjRgNC+0LLQsNC90L3Ri9C8INC90LDRh9Cw0LvRjNC90YvQvCDQv9GA0LjQsdC70LjQttC10L3QuNC10LwKICAgIHdoaWxlICgxKSB7CiAgICAgICAgdWludDMyX3QgdGVtcCA9IChyZXMgKyB4IC8gcmVzKSA+PiAxOwogICAgICAgIGlmICh0ZW1wID49IHJlcykgewogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmVzID0gdGVtcDsKICAgIH0KCiAgICByZXR1cm4gcmVzOwp9Cgp1aW50MzJfdCBzcXJ0SW50MzIodWludDMyX3QgbikgewoJaW50MzJfdCByZXQgPSAwOwoJaW50MzJfdCBzOwoJaW50MzJfdCByZXRfc3EgPSAtbiAtIDE7Cglmb3IgKHMgPSAzMDsgcyA+PSAwOyBzIC09IDIpIHsKCQlpbnQzMl90IGI7CgkJcmV0ICs9IHJldDsKCQliID0gcmV0X3NxICsgKCgyICogcmV0ICsgMSkgPDwgcyk7CgkJaWYgKGIgPCAwKSB7CgkJCXJldF9zcSA9IGI7CgkJCXJldCsrOwoJCX0KCX0KCXJldHVybiByZXQ7Cn0KCnVpbnQzMl90IGludF9zcXJ0NCh1aW50MzJfdCB4KSB7CiAgICBpZiAoeCA8IDIpIHJldHVybiB4OwoKICAgIC8vINCc0LDQs9C40YfQtdGB0LrQvtC1INC90LDRh9Cw0LvRjNC90L7QtSDQv9GA0LjQsdC70LjQttC10L3QuNC1CiAgICB1aW50MzJfdCByZXMgPSB4OwogICAgaWYgKHggPiAweEZGRkYpIHJlcyA9ICh4ID4+IDE2KSArIDE7CiAgICBlbHNlIGlmICh4ID4gMHhGRikgcmVzID0gKHggPj4gOCkgKyAxOwogICAgZWxzZSBpZiAoeCA+IDB4RikgcmVzID0gKHggPj4gNCkgKyAxOwogICAgZWxzZSByZXMgPSAoeCA+PiAxKSArIDE7CgogICAgLy8g0J7QtNC90LAg0LjRgtC10YDQsNGG0LjRjyDQndGM0Y7RgtC+0L3QsAogICAgcmVzID0gKHJlcyArIHggLyByZXMpID4+IDE7CgogICAgLy8g0JLRgtC+0YDQsNGPINC40YLQtdGA0LDRhtC40Y8gKNC80L7QttC90L4g0YPQsdGA0LDRgtGMLCDQtdGB0LvQuCDQvdGD0LbQvdCwINGB0YPQv9C10YAt0YHQutC+0YDQvtGB0YLRjCwg0L3QviDRgtC+0YfQvdC+0YHRgtGMINCx0YPQtNC10YIg0L3QuNC20LUpCiAgICByZXMgPSAocmVzICsgeCAvIHJlcykgPj4gMTsKCiAgICByZXR1cm4gcmVzOwp9CgppbnQgbWFpbigpCnsKICAgIAogICAgdWludDE2X3QgaSxqOwogICAgdWludDMyX3Qgc3FydCwgcmVzOwogICAgZm9yKGo9MDtqPDYwMDA7aisrKQogICAgZm9yKGk9MDtpPDQwOTU7aSsrKXsKICAgICAgICBzcXJ0ID0gaTsKICAgICAgICBzcXJ0ID0gc3FydCAqIHNxcnQ7CiAgICAgICAgcmVzID0gc3FydEludDMyKHNxcnQpOwogICAgICAgIGlmKGkgIT0gcmVzKXsKICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50ZigiZXJyb3IgJWQgcmVzICVkXG5cciIsaSxyZXMpOwogICAgICAgICAgICBqPTEwMDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIAogICAgCiAgICAKICAgIAogICAgcHJpbnRmKCJIZWxsbyBXb3JsZCIpOwoKICAgIHJldHVybiAwOwp9