Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?
- // показываем исходник
- if(isset($_GET["source"])) {
- show_source(__FILE__);
- }
- ini_set('display_errors', 1);
- define("DEBUG", false);
- function if_cc($num, $first_cc) {
- if(ctype_alnum($num) || is_numeric($num)) {
- $chars = str_split($num);
- $chars = array_reverse($chars);
- $e = 1;
- foreach($chars as $c) {
- if(!is_numeric($c)) {
- $n = letterConverter($c);
- } else {
- $n = $c;
- }
- if($n > $first_cc) {
- $e = 0;
- }
- }
- if($e) {
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
- // обрабатываем число
- function checkConverter($num, $lastss, $ss, $result = "") {
- if($lastss != 10 && $ss == 10) {
- return converterDec($num, $lastss);
- } else {
- return converter($num, $ss, $result);
- }
- }
- // конвертер в недесятичную систему
- function converter($num, $ss, $result = "") {
- if(is_float($num+0)) {
- $accuracy = strlen(substr(strrchr($num, "."), 1));
- $int = floor($num);
- $float = $num - $int;
- $i = converterInt($int, $ss, $result);
- $f = converterFloat($float, $ss, $accuracy, $result);
- return "$i.$f";
- } else {
- return converterInt($num, $ss, $result);
- }
- }
- // конвертер целых чисел
- function converterInt($num, $ss, $result = "") {
- $rest = $num / $ss;
- $rest = floor($rest);
- $result[] = $num % $ss;
- if($rest > 0) {
- return converterInt($rest, $ss, $result);
- } else {
- return return_array($result);
- }
- }
- // конвертер после ,
- function converterFloat($num, $ss, $accuracy, $result = "") {
- for($i = 0; $i <= $accuracy; $i++) {
- $rest = $num * $ss;
- $r = floor($rest);
- if(DEBUG) {
- echo "$num * $ss = $rest ($r) <br>";
- }
- $result[] = $r;
- $num = $rest - $r;
- }
- return return_array($result, false);
- }
- // конвертер в десятичную
- function converterDec($num, $lastss) {
- if(is_float($num+0)) {
- $int = floor($num);
- $float = $num - $int;
- $i = converterDecInt($int, $lastss);
- $f = converterDecFloat($float, $lastss);
- return "$i.$f";
- } else {
- return converterDecInt($num, $lastss);
- }
- }
- // конвертер целых десятичных
- function converterDecInt($num, $lastss) {
- $chars = str_split($num);
- $chars = array_reverse($chars);
- $str = "";
- foreach($chars as $i=>$c){
- if(is_numeric($c)) {
- if(DEBUG) {
- echo "$c * $lastss <sup>$i</sup> <br>";
- }
- $str += $c * pow($lastss, $i);
- } else {
- $str += letterConverter($c) * pow($lastss, $i);
- }
- }
- return $str;
- }
- // конвертер целых десятичных
- function converterDecFloat($num, $lastss) {
- $num = substr($num, strpos($num, ".") + 1);
- $accuracy = strlen($num);
- $chars = str_split($num);
- $str = "";
- foreach($chars as $i=>$c){
- $i++;
- if(is_numeric($c)) {
- if(DEBUG) {
- echo "$c * $lastss <sup>-$i</sup> <br>";
- }
- $str+= $c * pow($lastss, -$i);
- } else {
- $str+= letterConverter($c) * pow($lastss, -$i);
- }
- }
- $rr = round($str, $accuracy);
- return substr($rr, strpos($rr, ".") + 1);
- }
- // конвертер букв в цифры и обратно
- function letterConverter($l) {
- if(is_numeric($l)) {
- return strtoupper(chr($l + 87));
- } else {
- return ord(strtolower($l)) - 87;
- }
- }
- // возврат массива с числами в строку
- function return_array($result, $rev = true) {
- if($rev) {
- $result = array_reverse($result);
- }
- $string = "";
- foreach($result as $r) {
- if($r > 9) {
- $string.= letterConverter($r);
- } else {
- $string.= $r;
- }
- }
- return $string;
- }
- ?>
- <!doctype html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>Системы счисления</title>
- <link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css">
- <style>
- .wrapper {
- width: 500px;
- margin: 40px auto;
- }
- .big {
- padding: 25px;
- }
- .center {
- text-align: center;
- }
- footer {
- margin-top: 30px;
- text-align: center;
- border-top: 1px solid #ccc;
- padding-top: 10px;
- font-size: 12px;
- }
- .big-wrapper {
- width: 960px;
- }
- header {
- width: 100%;
- height: 10px;
- background: url(http://thepatternlibrary.com/img/aq.jpg);
- }
- </style>
- </head>
- <body>
- <header></header>
- <div class="wrapper <?=isset($_POST["submit"]) ? "big-wrapper" : ""?>">
- <?
- $first_cc = 12; // первая СС
- function calccc($a, $b, $cc) {
- if(is_float($a+0) || is_float($b+0)){
- $Apos = strpos(strrev($a), ".");
- $Bpos = strpos(strrev($b), ".");
- if($Apos > $Bpos) {
- $o = $Apos - $Bpos;
- for($i = 1; $i < $o; $i++){
- $b = $b."0";
- }
- }
- if($Bpos > $Apos) {
- for($i = 1; $i < $o; $i++){
- $a = $a."0";
- }
- }
- $Alen = strlen(substr($a, 0, strpos($a, ".")));
- $Blen = strlen(substr($b, 0, strpos($b, ".")));
- if($Blen > $Alen) {
- $o = $Blen - $Alen;
- for($i = 0; $i < $o; $i++){
- $a = "0".$a;
- }
- }
- if($Alen > $Blen) {
- $o = $Alen - $Blen;
- for($i = 0; $i < $o; $i++){
- $b = "0".$b;
- }
- }
- } else {
- $Alen = strlen($a);
- $Blen = strlen($b);
- if($Blen > $Alen) {
- $o = $Blen - $Alen;
- for($i = 0; $i < $o; $i++){
- $a = "0".$a;
- }
- }
- if($Alen > $Blen) {
- $o = $Alen - $Blen;
- for($i = 0; $i < $o; $i++){
- $b = "0".$b;
- }
- }
- }
- $Achars = str_split($a);
- $Achars = array_reverse($Achars);
- $Bchars = str_split($b);
- $Bchars = array_reverse($Bchars);
- $new = array();
- $rest = 0;
- foreach($Achars as $key=>$ac) {
- if($ac == ".") {
- $new[] = ".";
- } else {
- if(is_numeric($ac)) {
- $na = $ac;
- } else {
- $na = letterConverter($ac);
- }
- if(is_numeric($Bchars[$key])) {
- $nb = $Bchars[$key];
- } else {
- $nb = letterConverter($Bchars[$key]);
- }
- $nn = $rest + $na + $nb;
- $rest = 0;
- if($nn > $cc) {
- $x = $nn - $cc;
- $rest = ($nn-$x)/$cc;
- } else {
- $x = $nn;
- }
- if(is_numeric($nn)) {
- $new[] = $x;
- } else {
- $new[] = letterConverter($x);
- }
- }
- }
- if($rest > 0) { $new[] = $rest; }
- return return_array($new, true);
- }
- if(isset($_POST["submit"])) {
- $A = $_POST["A"];
- $A = str_replace(',', '.', $A);
- $B = $_POST["B"];
- $B = str_replace(',', '.', $B);
- $C = $_POST["C"];
- $C = str_replace(',', '.', $C);
- $ACheck = str_replace(".", "", str_replace(",", "", $A));
- $BCheck = str_replace(".", "", str_replace(",", "", $B));
- $CCheck = str_replace(".", "", str_replace(",", "", $C));
- $n = 0;
- if(if_cc($ACheck, $first_cc) && if_cc($BCheck, $first_cc) && if_cc($CCheck, $first_cc)){
- ?>
- <h3>Результат:</h3>
- <div class="big bg-info">
- <table class="table">
- <thead style="font-weight:bold;">
- <tr>
- <td width="8%"><span class="text-muted">№</span></td>
- <td width="23%"><?=$first_cc?></td>
- <td width="23%">10</td>
- <td width="23%">28</td>
- <td width="23%">9</td>
- </tr>
- </thead>
- <tbody>
- <?
- $result = array();
- $i = 0;
- while($A < $C) {
- $A = calccc($A, $B, $first_cc);
- ?>
- <tr>
- <td><?=++$i?></td>
- <td><?=$A?></td>
- <td><?=checkConverter($A, $first_cc, 10, $result)?></td>
- <td><?=checkConverter($A, $first_cc, 28, $result)?></td>
- <td><?=checkConverter($A, $first_cc, 9, $result)?></td>
- </tr>
- <?
- }
- ?>
- </tbody>
- </table>
- </div>
- <p class="text-right"><a href="#" onclick="location.reload(true)">Еще разок?</a></p>
- <?
- } else {
- echo '<p class="big bg-danger">Ошибка! Вы должны ввести <strong>число в '.$first_cc.'-ричной системе счисления</strong></p>';
- }
- } else {
- ?>
- <form method="post">
- <label for="num">Введите число "A" в <?=$first_cc?>-ричной системе счисления:</label>
- <input id="num" class="form-control" name="A" type="text" placeholder="Например: <?=rand(5,15)?>" value="100.10">
- <label for="num">Введите число "B":</label>
- <input id="num" class="form-control" name="B" type="text" placeholder="Например: <?=rand(5,15)?>" value="4.32">
- <label for="num">Введите число "C":</label>
- <input id="num" class="form-control" name="C" type="text" placeholder="Например: <?=rand(5,15)?>" value="12341.22">
- <br>
- <input class="btn btn-default" type="submit" name="submit">
- </form>
- <?
- }
- ?>
- </div>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement