Программа находит все делители целого положительного числа

Я хочу, чтобы найти все делители числа. В настоящее время у меня есть это:

< int n; int i=2; scanf(«%d», while(igetch(); >

есть ли способ улучшить его?

автор: Rndm

7 ответов

запустите цикл до квадратного корня числа (т. е. i
< int n; int i=2; scanf(«%d», while(i > i++; > getch(); >
автор: Rndm

поиск всех делителей с помощью «поиск всех простых факторов» в C (быстрее) и до 18 цифр.

#include #include #include #include unsigned int FindDivisors(unsigned long long divisors[], unsigned long long N) < unsigned int lastdiv = 0; divisors[lastdiv++] = 1; unsigned long long powerfactor = 1; unsigned long long number = N; while ((number powerfactor >= 1; > unsigned long long factor = 3; unsigned long long upto = lastdiv; powerfactor = 1; while (factor * factor else < factor += 2; upto = lastdiv; powerfactor = 1; >> if (number > 1) < if (number != factor) < upto = lastdiv; powerfactor = 1; >powerfactor *= number; for (unsigned int i = 0; i < upto; i++) divisors[lastdiv++] = divisors[i] * powerfactor; >return lastdiv; > int cmp(const void *a, const void *b) < if( *(long long*)a-*(long long*)b < 0 ) return -1; if( *(long long*)a-*(long long*)b >0 ) return 1; return 0; > int main(int argc, char *argv[]) < unsigned long long N = 2; unsigned int Ndigit = 1; if (argc >1) < N = strtoull(argv[1], NULL, 10); Ndigit = strlen(argv[1]); >unsigned int maxdiv[] = ; unsigned long long divisors[maxdiv[Ndigit]]; unsigned int size = FindDivisors(divisors, N); printf(«Number of divisors = %un», size); qsort(divisors, size, sizeof(unsigned long long), cmp); for (unsigned int i = 0; i
автор: ManAndPC

простой линейный поиск может быть улучшен, сначала выбрасывая все факторы 2. Это может быть сделано простым сдвигом бит или подсчетом нулей с хорошей внутренней функцией. Это очень быстро в любом случае. Затем запустите алгоритм, предложенный shg (который будет работать намного быстрее теперь, когда нет двух степеней), и объедините результат со всеми возможными степенями двух (не забудьте этот шаг). Это помогает много для входов, которые имеют много нулевых тренировок, но это даже помогает если они этого не сделают, вам больше не придется тестировать четные делители, поэтому цикл становится вдвое короче.

Читайте также:
Входные точки в программу пример

Математика 6 класс. Как найти все делители числа и не пропустить ни одного? Удивите даже учителей.

выбрасывание некоторых постоянных низких факторов (но больше 2) также может помочь. Модуль с константой почти наверняка оптимизирован компилятором (или, если нет, вы можете сделать это сами), но что более важно, это означает, что осталось меньше делителей для тестирования. Не забудьте объединить этот фактор с делителями, которые вы найдете.

вы также можете полностью разложить число на множители (используйте свой любимый алгоритм-вероятно, Rho Полларда будет лучше всего), а затем распечатайте все продукты (кроме пустого продукта и полного продукта) факторов. Это имеет хороший шанс оказаться быстрее для больших входных данных — алгоритм Rho Полларда находит факторы очень быстро по сравнению с простым линейным поиском, обычно меньше факторов, чем правильные делители, и последний шаг (перечисление продуктов) включает только быструю математику (без делений). Это в основном помогает для чисел с очень маленькие факторы, которые Ро находит быстрее всего.

Как найти все делители числа?

автор: harold

код, представленный в одном из ответов, имеет ошибку, которую трудно увидеть на первый взгляд. Если sqrt (n) является действительным делителем; но n не является идеальным квадратным числом, тогда два результата опущены.

Е. Г. Попробовать n = 15 , и посмотреть, что происходит; sqrt(15) = 3 , поэтому последнее значение цикла while равно 2. Следующее заявление выполнено if (i * i == n) будет выполнен как if(3 * 3 == 15) . Таким образом, 3 Не указан как делитель, также 5 был пропущен.

следующие будут обрабатывать общий случай положительных целых чисел правильно.

< int n; int i=2; scanf(«%d», while(i > i++; > getch(); >
автор: Duckman
int count = 2; //long childsum = 0; long _originalvalue = sum; dividend = «1»; for (int i = 2; i < sum; i++) < if (_originalvalue % i == 0) < sum = _originalvalue / i; //sum = childsum; dividend = dividend + «,» + i+»,»+sum; if (sum == i) < count++; >else < count = count + 2; >> > return count;
автор: Himanshu Jain

Читайте также:
Исследовательская программа неоинституциональной теории

когда заданное число нечетно, мы можем даже пропустить четные числа. Небольшая импровизация в принятом коде:)

вот это Java-код для нахождения коэффициентов данного ряда.

import java.util.Scanner; public class Factors < public static void main(String[] args) < Scanner scanner = new Scanner(System.in); int t=scanner.nextInt(); while(t— >0) < int n = scanner.nextInt(); if(n % 2 == 0) < for(int i = 1; i > > > else < for(int i = 1; i > > > > > >
автор: manohar e

Это моя новая версия C#. Благодаря Rndm это почти в 50 раз быстрее, чем моя первая попытка.

public static long GetDivisors(long number) < long divisors = 0; long boundary = (long)Math.Sqrt(number); for (int i = 1; i > > > return divisors; >

Источник: askdev.ru

Написать программу, которая находит все делители введенного числа N. паскаль

program zz1;
var n, i:integer; // задаем переменные целого типа
begin
write(‘ введите число n ‘); // вводим с клавиатуры заданное число
read(n);
write(‘ Делители числа ‘, n, ‘: ‘);
for i:=1 to n do // организуем цикл, в котором переберем все числа от 1 до n
begin
if n mod i = 0 // проверяем число на делимость, если заданное число делится без остатка, то
then write(i, ‘ ‘); // выводим делитель на экран
end;
end.

Как добавить хороший ответ?

Что необходимо делать:

  • Написать правильный и достоверный ответ;
  • Отвечать подробно и ясно, чтобы ответ принес наибольшую пользу;
  • Писать грамотно, поскольку ответы без грамматических, орфографических и пунктуационных ошибок лучше воспринимаются.

Что делать не стоит:

  • Списывать или копировать что-либо. Высоко ценятся ваши личные, уникальные ответы;
  • Писать не по сути. «Я не знаю». «Думай сам». «Это же так просто» — подобные выражения не приносят пользы;
  • Писать ответ ПРОПИСНЫМИ БУКВАМИ;
  • Материться. Это невежливо и неэтично по отношению к другим пользователям.

Пример вопроса

Русский язык

7 минут назад

Какой синоним к слову «Мореплаватель»?

Пожаловаться

Хороший ответ

Вася Иванов

Мореплаватель — имя существительное, употребляется в мужском роде. К нему может быть несколько синонимов.
1. Моряк. Старый моряк смотрел вдаль, думая о предстоящем опасном путешествии;
2. Аргонавт. На аргонавте были старые потертые штаны, а его рубашка пропиталась запахом моря и соли;
3. Мореход. Опытный мореход знал, что на этом месте погибло уже много кораблей, ведь под водой скрывались острые скалы;
4. Морской волк. Старый морской волк был рад, ведь ему предстояло отчалить в долгое плавание.

Читайте также:
Программа экспресс в мультиварке редмонд сколько времени готовить рис

Источник: uchi.ru

Ниже приведены несколько вариантов программы для нахождения всех делителей целого положительного числа (условный оператор if (!(num % div)) определяет, делится ли число num на div без остатка). В каком случае цикл будет выполнен хотя бы один раз для переменной num = 3 ?

Ниже приведены несколько вариантов программы для нахождения всех делителей целого положительного числа (условный оператор if (!(num % div)) определяет, делится ли число num на div без остатка). Пользователь ввел значение переменной num = 3 . В каком случае цикл не выполнится ни одного раза?

Ниже приведены несколько вариантов программы для нахождения всех делителей целого положительного числа (условный оператор if (!(num % div)) определяет, делится ли число num на div без остатка). Пользователь ввел значение переменной num = 3 . В каком случае значение переменной div не изменится?

Функция is_in определяет, входит ли символ c в строку s :
int is_in(char *s, char c) (1)
Чему будет равно значение переменной i в результате вызова int i = is_in(«Lection 10», ‘a’) ?
В каком случае значение переменной z будет равно изначальному значению переменной x ?

Требуется написать программу, которая копирует введенную пользователем строку str1 в строку str2 в обратном порядке. Например, если пользователь ввел строку string , то str2 в результате выполнения данной программы должна быть равна gnirts . Какая программа выполняет поставленную задачу?

Требуется написать программу, которая копирует введенную пользователем строку str1 в строку str2 в обратном порядке. Например, если пользователь ввел строку string , то str2 в результате выполнения данной программы должна быть равна gnirts . Какая программа выполняет поставленную задачу?

Сколько раз будет выполнен цикл for ?

int x=123; printf(«Угадайте число:n»); for (x=0; x==123; ) scanf(«%d»,
Сколько раз будет выполнен цикл for ?
int x; printf(«Угадайте число:n»); for (x=0; x!=123; ) scanf(«%d»,
В каком случае переменные a и b будут невидны в функции main() ?

Указатель p инициализирован строковой константой: char *p = «тестовая строка» . Что в данном случае хранится в указателе p ?

Источник: bazaintuit.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru