Jump to content

Большие Числа


Great Rash
 Share

Recommended Posts

Вечером делать было нечего и я решил написать абсолютно бесполезный скрипт, который переводит числа в слова. Т.е. 158 = сто пятьдесят восемь. Решил для начала поискать в википедии какие вообще числа бывают и нашел много занимательного материала на эту тему.

Среди всего прочего нашел интересный факт о том что Google был назван в честь одного из самых больших чисел - гугол. Такие дела...

Вот мой скрипт (вдруг кому интересно):

function num2text(num) {
var units = ['ноль', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'];
var less20 = ['одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'];
var tens = ['десять', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестдесят', 'семдесят', 'восемдесят', 'девяносто'];
var hundreds = ['сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'];
var thousands = ['тысяча', 'тысячи', 'тысяч'];
var millions = ['миллион', 'миллиона', 'миллионов'];
var billions = ['миллиард', 'миллиарда', 'миллиардов']; // 10^9
var trillions = ['триллион', 'триллиона', 'триллионов']; // 10^12
var quadrillions = ['квадриллион', 'квадриллиона', 'квадриллионов']; // 10^15
var quintillions = ['квинтилион', 'квинтиллиона', 'квинтиллионов']; // 10^18
var sextillions = ['секстиллион', 'секстиллиона', 'секстиллионов']; // 10^21
var septillions = ['септиллион', 'септиллиона', 'септиллионов']; // 10^24
var oktillions = ['октиллион', 'октиллиона', 'октиллионов']; // 10^27
var nonilion = ['нониллион', 'нониллиона', 'нониллионов']; // 10^30
var decillion = ['дециллион', 'дециллиона', 'дециллионов']; // 10^33

if (num < 10) {
return units[num];
} else if (num == 10) {
return tens[0];
} else if (num > 10 && num < 20) {
num = (num % 10) - 1;

return less20[num];
} else if (num >= 20 && num < 100) {
var n2 = num % 10;
var n1 = (num - n2) / 10 - 1;

var n2str = n2 === 0 ? '' : ' ' + units[n2];

return tens[n1] + n2str;
} else if (num >= 100 && num < 1000) {
var n3 = num % 10;
var n2 = (num % 100) - n3;
var n1 = (num - (n2 + n3)) / 100 - 1;

var n2str = tens[n2 / 10 - 1] ? ' ' + tens[n2 / 10 - 1] : '';
var n3str = n3 === 0 ? '' : ' ' + units[n3];

return hundreds[n1] + n2str + n3str;
} else if (num >= 1000) {
alert('дохрена... дохрена кода писать лень');
}
}

alert(num2text(348));
alert(num2text(16));
alert(num2text(15788));

Интересно можно ли переводить цифры в слова как-нить попроще? А то это ж сколько кода писать придется для такого числа - 5'257'357'657'456...

Link to comment
Share on other sites

Интересно можно ли переводить цифры в слова как-нить попроще? А то это ж сколько кода писать придется для такого числа - 5'257'357'657'456...

Нужен двумерный массив, а не набор одномерных.

words[ 0 ] = { range: 10, divider: 1E1, values: [ 'ноль', 'один' .. ] }

words[ 1 ] = { range: 20, divider: 0.2E2, values: [ 'десять', 'одинадцать' .. ] }

и так далее.

Потом идти в обратном порядке по этом массиву, и если число становится меньше чем range, то отрабатываем результат деления числа на divider, потом нам нужно взять остаток от деления и продолжить работу с ним, пока не будет завершен цикл.

Короче, хорошая задачка для тех, кто хочет поковырять JS.

Link to comment
Share on other sites

2s0rr0w:

Шо за зверь такой - divider: 1E1? Т.е. я знаю что это за число и что JavaScript умеет работать с экспонентой, но как это применить к такой задаче не понятно.

А все, не вчитался просто в пост... ща попробую заюзать.

Link to comment
Share on other sites

2s0rr0w:

Шо за зверь такой - divider: 1E1? Т.е. я знаю что это за число и что JavaScript умеет работать с экспонентой, но как это применить к такой задаче не понятно.

1E1 = 1 * 10^1 = 10

0.2E2 = 0.2 * 10^2 = 0.2 * 100 = 20

Наиболее простой способ записи разрядов.

Link to comment
Share on other sites

А че... ради прикола можно добавить :lol:

else if (num == 100500) {
return 'стопицот';
}

P.S. Кстати, забавная система счисления была у древних славян:

10'000 = тьма

100'000 = легион

10^8 = колода

Продвинутые люди были... я уж думал, что тогда и цифирь то таких не знали, а оно вона как...

Link to comment
Share on other sites

А че... ради прикола можно добавить :lol:

else if (num == 100500) {
return 'стопицот';
}

P.S. Кстати, забавная система счисления была у древних славян:

10'000 = тьма

100'000 = легион

10^8 = колода

Продвинутые люди были... я уж думал, что тогда и цифирь то таких не знали, а оно вона как...

1k. забыл еще добавить, это от них пошло тоже.

Link to comment
Share on other sites

А вот так не пойдёт?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Слова</title>
<style type="text/css">
*{ margin: 0; padding: 0;}

</style>
</head>

<body>

<input type="text" id="in" />
<input type="submit" value="Нажать" id="sub" />
<script type="text/javascript">

var arr = [];

arr[arr.length] = {range: 10,values: ['ноль',"один","два","три","четыре","пять","шесть","семь","восемь","девять"]}
arr[arr.length] = {range: 20,values: ['десять',"одинадцать","двенадцать","тренадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать"]}
arr[arr.length] = {range: 100,values: ['','','двадцать',"тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"]}
arr[arr.length] = {range: 1000,values: ['','сто',"двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"]}
arr[arr.length] = {range: 10000,values: ['','тысяча',"две тысячи","три тысячи","четыре тысячи","пять тысяч","шесть тысяч","семь тысяч","ввосемь тысяч","девять тысяч"]}
document.getElementById('sub').onclick = function(){

var input = document.getElementById('in');
var z = 0;
var flug = true;
var str = parseInt(input.value);
var num = '';
function outer(str){
for(var i=0;i<arr.length;i++){
for(k in arr[i]){
if(flug){
if(str<arr[i].range){
str = parseInt(str);
if(str>=10 && str<20){
var e = parseInt(input.value[z+1]);
num+= arr[i].values[e]+' ';
flug = false;
return;
}
if(z == input.value.length) return;
var e = parseInt(input.value[z]);
num+= arr[i].values[e]+' ';
str = input.value.substring(z+1);
z++;
arguments.callee(str);
}
}else {return;}
}
}
}

outer(str)
if(num.length>4){num=num.replace(/ноль/g,'')}
alert(num)
};


</script>
</body>
</html>

Link to comment
Share on other sites

Нет все-таки не понятно как обрабатывать действительно большие числа типа миллиона.

Смотри, у тебя, к примеру, есть такое число x = 22 000 000 001

Запускаем некую функцию.

Последний элемент в твоем массиве, пусть будет 1E12

Делим x на 1E12. Получаем число меньше нуля. Идем дальше, divider = 1E9

Делим x на 1E9, получаем 22.000000001. Округляем в меньшую сторону, получаем 22.

Запускаем эту же функцию, передаем параметр 22. Функция дойдет до 1E1. Делим 22 на 1E1, округляем, получаем 2.

Вычитаем из 22 число 2*1Е1 и получаем 2

Запускаем функцию с этим параметром

Возвращаемся к нашему 22. Умножаем 22 на 1Е9 и отнимаем это число от x. Получаем 1

И так далее.

С одинадцать и прочими нужно сделать исключение, я в примере чуток ошибся.

Link to comment
Share on other sites

Что-то я все равно не понимаю... это ж какие громадные массивы получатся при миллиардах, триллионах и т.п. Опять же как быстро будет работать цикл по какому-нибудь зиллиону?

Link to comment
Share on other sites

Что-то я все равно не понимаю... это ж какие громадные массивы получатся при миллиардах, триллионах и т.п. Опять же как быстро будет работать цикл по какому-нибудь зиллиону?

Вполне быстро. Потому что количество итераций будет ограничено количеством разрадов умножить на три. Примерно так.

s0rr0w

А мой вариант поругай плиз :lol:

Попробуй сделать 100 миллионов :lol:

Link to comment
Share on other sites

100500!

Человек дело говорит, инфа 100%, от этого числа любой скрипт попячится, ибо оно содержит приблизительно 469000 цифр.

А что же такое стопицот?

стопиццот, это кагбэ сто и пицот вместе, но это намного больше, чем сто тысяч пятьсот.

Стопиццот >> 100 500

Это кагбэ сверхвысшая математика, соле которой можно прозреть только некоторым избранным, которым даровано благоволение ОНОТОЛЕЯ. :lol:

Чтобы полностью прозреть соле 100500, нужно дважды закончить НМУ.

Edited by Игорь Ермаков
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy