Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Поиск делителей


Автор: Aliance 27.1.2005, 00:23
Можно ли с помощью JS найти делители целые числа?

И можно ли найти десятые, сотые и т.д. числа, без исп. метода slice() и т.п.
Т.е. 678 = 6 сотых + 7 десятых + 8 целых, т.е. имея числа xyz, узнать целочисленные параметры x, y и z?

Автор: Се ля ви 27.1.2005, 00:29
Ну да - конвертишь в строку и разбираешь посимвольно. Примерно так:
Код

var x = new String(687);
alert('сотые - ' + x.charAt(0) + ', десятые - ' + x.charAt(1) + ', единицы - ' + x.charAt(2));

Автор: Aliance 27.1.2005, 00:31
Се ля ви
Ха, а если мы не знаем переменную x ?! Если пользователь вводит ее с клавиатуры?

Автор: Gregof 27.1.2005, 09:45
Может так?
Код

var strWithNum='123';
var res=new Array,a=new Array("1","10","100","1000");
for(var i=strWithNum.length;i>0;i--)
   res[strWithNum.length-i]=a[i-1]+' - '+strWithNum.charAt(i-1);
res=res.join(',');


А почему нельзя найти делители?
Алгоритм их поиска весьма несложен, проблем с реализацией его на JS я тоже не вижу.

Автор: Aliance 27.1.2005, 16:46
Gregof
Ты проверял эту функцию для 12813432758974258926754892 ?


Цитата(Gregof @ 27.1.2005, 09:45)
Алгоритм их поиска весьма несложен, проблем с реализацией его на JS я тоже не вижу.

Помоги, напиши.

Автор: Sardar 27.1.2005, 22:42
Aliance что то я смысл задачи не догоняю... Тебе просто нужно разобрать десятичны числа посимвольно? Приведи к строке и бери как показали выше...

Автор: Aliance 27.1.2005, 23:04
Sardar
Как показал Се ля ви это верно, но мне не подходит, т.к. мне нужно это к любому числу от 0 до бесконечности (мы не знаем число)

Автор: Sardar 27.1.2005, 23:44
Дык задача детская smile Бесконечные числа ты по любому обрабатывать не сможешь, у тебя конечное множество слов, да и числа не бесконечные. Или я не понял задачи:
Код
chisla.names=[
 {name:"еденицы: ",delim:1},
 {name:"десятки: ",delim:10},
 {name:"сотни", delim:100},
 {name:"тысячи",delim:1000},
 {name:"миллионы",delim:1000000}
];
function chisla(chislo) {
 var i, num = Math.abs(chislo), ret=[];
 for(i=chisla.names.length-1; i>=0 && chisla.names[i].delim>num; i--);
 for(; i>=0; i--) {
   ret.push(chisla.names[i].name.concat(Math.floor(num/chisla.names[i].delim)));
num=num%chisla.names[i].delim;
 }
return ret;
}

alert(chisla(12305));

Автор: Aliance 28.1.2005, 00:23
Sardar
Ааа, нееет =) Не детская...
Не бесконечны, ну это есесно smile
Но в твоем коде число 10 миллионов не подойдет, верно?
Я хочу так:
Код

var chislo = promt("Введите любое целое натуральное число");
...

Как мне от сюда узнать все необходимое ? :-/

Автор: Sardar 28.1.2005, 00:41
Цитата(Aliance @ 27.1.2005, 23:23)
Но в твоем коде число 10 миллионов не подойдет, верно?

А ты попробуй smile

Автор: sergejzr 28.1.2005, 01:50
Так ведь тот же псевдокод (не пробовал, но должен идти)...
Код

var chislo = promt("Введите любое целое натуральное число");
for(var i=chislo.length-1;i>0;i--)
{
document.write(Math.pow(10,i)+(i<3?"-и":"-ы")+chislo.charAt(i)+"<br>");
}
document.write("1-ы"+chislo.charAt(0)+"<br>");


Автор: Gregof 28.1.2005, 13:31
Цитата(Aliance @ 27.1.2005, 16:46)
Цитата (Gregof @ 27.1.2005, 09:45)
Алгоритм их поиска весьма несложен, проблем с реализацией его на JS я тоже не вижу.
Помоги, напиши.

Читай тут http://algolist.manual.ru/maths/teornum/factor/
Но опять же все они для конечных чисел. Если делать вриант для бесконечных чисел, то придётся реализовывать длинную арифметику, что само собо несложно. Просто алгоритм поиска делителей с использованием длинной арифметики будет иметь огромнейшую вычислительную сложность.

Автор: Alx 28.1.2005, 16:37
я чё-то не въеду, а почему нельзя посчитать длину строки-1 - получим что за самое высокое число, например для 1 млн - это будет 6... в общем щас попробую

Автор: Alx 28.1.2005, 17:00
вот, надеюсь это тебе подойдёт))

http://portfolio.alx.com.ru/scripts/javascript/delitel.html

Код

<script language="JavaScript">
<!--//
function delitel(inp)
{var out = "";
var realn = inp.length - 1;
var zeros = "";
for (var i=0;i<inp.length;i++)
{zeros = "";
for (var k=0;k<realn;k++)
{zeros += "0";
}
out += " + " + inp.charAt(i) + zeros;
realn--;
}
var re = new RegExp(" \\+ ");
out = out.replace(re, " ");
return out;
}

var p1 = prompt("Введите целое число:","");
document.write(delitel(p1));
//-->
</script>

Автор: Aliance 28.1.2005, 17:15
Alx
Спасибо, это работает :-)

Автор: sergejzr 28.1.2005, 19:37
Только вместо

Код

for (var k=0;k<realn;k++)
{zeros += "0";
}


можно

Код

zeros=Math.pow(10,realn)+"";

Автор: Gregof 31.1.2005, 12:13
Странно, что функция delitel раскладывает число не на делители smile
Ну, ситуация вроде была нормально обьяснена smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)