pragma solidity ^0.4.15; library SafeMath { function mul(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal constant returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal constant returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } contract Simple { using SafeMath for uint256; uint256 m100=100000000; uint256 ln3= 109861228; uint256 ln10=230258512; uint256 ln20=299573231; uint256 ln30=340119743; uint256 ln50=391202307; uint256 ln100=460517025; uint256 ln200=529831743; uint256 ln500=621460819; uint256 ln1000=690775527; function test2(uint256 a){ test1(a); } function test1(uint256 a) constant returns (uint256 result) { uint256 lnbase; uint256 a0; if(a > m100.mul(1000)){ lnbase = ln1000; a0 = a.div(1000); }else if(a > m100.mul(500)){ lnbase=ln500; a0 = a.div(500); }else if(a > m100.mul(200)){ lnbase = ln200; a0 = a.div(200); }else if(a > m100.mul(100)){ lnbase = ln100; a0 = a.div(100); }else if(a > m100.mul(50)){ lnbase = ln50; a0 = a.div(50); }else if(a > m100.mul(30)){ lnbase = ln30; a0 = a.div(30); }else if(a > m100.mul(20)){ lnbase = ln20; a0 = a.div(20); }else if(a > m100.mul(10)){ lnbase = ln10; a0 = a.div(10); }else if(a > m100.mul(3)){ lnbase = ln3; a0 = a.div(3); }else if(a > m100){ lnbase = 0; a0 = a; }else{ return a; } uint256 x=a0.sub(m100).mul(m100).div(a0.add(m100)); uint256 y=x.add(x.mul(x).mul(x)/m100/m100/3).mul(2); y=lnbase.add(y); y=y.mul(7)/100; x=a.add(a.mul(y)/m100); x = x.add(a.mul(y).mul(y)/m100/m100/2); y = a.mul(y).mul(y).mul(y); x = x.add(y/m100/m100/m100/6); return (x); } }
Source: https://habr.com/ru/post/340984/
All Articles