Напишите в комментариях к этой записи консольные приложения для решения этих задач, укажите также код и условие задачи.
Внимание! Под делителями целого числа n (n > 1) в нижеследующих задачах следует понимать простые числа (в смысле основной теоремы арифметики, n не равно 1). Например: 12=2*2*3, 27 = 3*3*3, 205=5*41 (составные числа), 257=257 (простое число, без сомножителя 1). Если n=1, то считать, что один делитель = 1.
Решены задачи 1-3, 7, 10, 18, 21.
Задачи
Y3.1. Найти количество делителей каждого из целых чисел от 120 до 140.
Y3.2. Составить программу для графического изображения делимости чисел от 1 до n (значение n вводится с клавиатуры). В каждой строке надо напечатать очередное число и столько символов «+», сколько делителей у этого числа. Например, если n = 4, то на экране должно быть напечатано:
1+
2++
3++
4+++
Y3.3. Найти все целые числа из промежутка от 1 до 300, у которых ровно пять делителей.
Y3.4. Найти все целые числа из промежутка от 200 до 500, у которых ровно шесть делителей.
Y3.5. Найти все целые числа из промежутка от a до b, у которых количество делителей равно k.
Y3.6. Найти натуральное число из интервала от a до b, у которого количество делителей максимально. Если таких чисел несколько, то должно быть найдено:
а) максимальное из них;
б) минимальное из них.
Y3.7. Найти все трехзначные простые числа (простым называется натуральное число, большее 1, не имеющее других делителей, кроме единицы и самого себя).
Y3.8. Найти 100 первых простых чисел.
Y3.9. Найти сумму делителей каждого из целых чисел от 50 до 70.
Y3.10. Найти все целые числа из промежутка от 100 до 300, у которых сумма делителей равна 50.
Y3.11. Найти все целые числа из промежутка от 300 до 600, у которых сумма делителей кратна 10.
Y3.12. Натуральное число называется совершенным, если оно равно сумме своих делителей, включая 1 и, естественно, исключая это самое число. Например, совершенным является число 6 ( 6 1 2 3 ). Найти все совершенные числа, меньшие 100 000.
Y3.13. Найти натуральное число из интервала от a до b с максимальной суммой делителей.
Y3.14. Два натуральных числа называются дружественными, если каждое из них равно сумме всех делителей другого (само другое число в качестве делителя не рассматривается). Найти все пары натуральных дружественных чисел, меньших 50 000.
Y3.15. Найти размеры всех прямоугольников, площадь которых равна заданному натуральному числу s и стороны которых выражены натуральными числами. При этом решения, которые получаются перестановкой размеров сторон:
а) считать разными;
б) считать совпадающими.
Y3.16. Найти размеры всех прямоугольных параллелепипедов, объем которых равен заданному натуральному числу v и стороны которых выражены натуральными числами. При этом решения, которые получаются перестановкой размеров ребер параллелепипеда:
а) считать разными;
б) считать совпадающими.
Y3.17. Составить программу для нахождения всех натуральных решений (x и y) уравнения x2 + y2 = k2, где x, y и k лежат в интервале от 1 до 30. Решения, которые получаются перестановкой x и y, считать совпадающими.
Y3.18. Даны натуральные числа m и n. Вычислить 1n + 2n + … + mn.
Y3.19. Дано натуральное число n. Вычислить 11 + 22 + … + nn.
Y3.20. Дано натуральное число n (n ≤ 27). Найти все трехзначные числа, сумма цифр которых равна n. Операции деления, целочисленного деления и определения остатка не использовать.
Y3.21. Напечатать в возрастающем порядке все трехзначные числа, в десятичной записи которых нет одинаковых цифр. Операции деления, целочисленного деления и определения остатка не использовать.
Y3.22. Даны n натуральных чисел. Найти их наибольший общий делитель, используя алгоритм Евклида и учитывая, что НОД(a, b, c) = НОД(НОД(a, b), c).
Y3.23. Имеются 10 гирь весом 100, 200, 300, 500, 1000, 1200, 1400, 1500, 2000 и 3000 г. Сколькими способами гирями этого набора можно составить вес в V грамм.
Y3.24. Дано натуральное число n (n < 100).
а) Определить число способов выплаты суммы n рублей с помощью монет достоинством 1, 2, 5 рублей и бумажных купюр достоинством 10 рублей.
б) Получить все способы выплаты (указать, какие монеты и купюры и в каком количестве следует использовать).
Y3.25. Даны натуральные числа m и n. Получить все натуральные числа, меньшие n, квадрат суммы цифр которых равен m.
Y3.26. В некоторой стране используются денежные купюры достоинством в 1, 2, 4, 8, 16, 32 и 64. Дано натуральное число n. Как наименьшим количеством таких денежных купюр можно выплатить суммы n, n + 1, …, n + 10 (указать количество каждой из используемых для выплаты купюр)? Предполагается, что имеется достаточно большое количество купюр всех достоинств.
Y3.27. Составить программу нахождения цифрового корня натурального числа. Цифровой корень данного числа получается следующим образом. Если сложить все цифры этого числа, затем все цифры найденной суммы и повторять этот процесс, то в результате будет получено однозначное число (цифра), которая и называется цифровым корнем данного числа.
Y3.28. Старинная задача. Имеется 100 рублей. Сколько быков, коров и телят можно купить на все эти деньги, если плата за быка — 10 рублей, за корову — 5 рублей, за теленка — полтинник (0,5 рубля) и надо купить 100 голов скота?
Y3.29. Дано натуральное число n. Напечатать разложение этого числа на простые множители. Реализовать два варианта:
1) каждый простой множитель должен быть напечатан один раз;
2) каждый простой множитель должен быть напечатан столько раз, сколько раз он входит в разложение.
Y3.30. Дано натуральное число n. Получить все простые делители этого числа.
Y3.31. Дано натуральное число n. Получить все натуральные числа, меньшие n и взаимно простые с ним (два натуральных числа называются взаимно простыми, если их наибольший общий делитель равен 1).
Y3.32. Даны целые числа n и m. Получить все натуральные числа, меньшие n и взаимно простые с p.
Y3.33. Даны целые числа p и q. Получить все делители числа q, взаимно простые с p.
Y3.34. Найти наименьшее натуральное число n, которое можно представить двумя различными способами в виде суммы кубов двух натуральных чисел.
Y3.35. Найти все простые несократимые дроби, заключенные между 0 и 1, знаменатели которых не превышают 7 (дробь задается двумя натуральными числами — числителем и знаменателем).
NEW: Наш Чат, в котором вы можете обсудить любые вопросы, идеи, поделиться опытом или связаться с администраторами.
Y3.35
for (float denominator = 1; denominator < 8; denominator++)
{
for (float numerator = 0; numerator < 8; numerator++)
{
if (numerator == denominator) break;
float x = numerator / denominator;
Console.WriteLine(x);
}
}
А почему используется float? Тут вполне достаточно int. Float очень «коварный» тип и нужно использовать его с осторожностью.
Y3.3
static void Main(string[] args)
{
ArrayList div = new ArrayList();
for (int i=1; i<=300;i++)
{
int k=0;
for (int j = 1; j/2 <= i; j++)
{
if (k > 5) { break; }
if(i%j==0) {k++;}
}
if (k==5) { div.Add(i); }
}
foreach(int i in div) { Console.WriteLine(i + » «); }
Console.ReadLine();
}
Все правильно. Но есть пара замечаний. Во-первых, ArrayList устаревший класс и сейчас его не рекомендуется применять, лучше использовать List. А во-вторых вложенный цикл можно начинать с 2 т.к. на 1 делятся все числа.
Y3.6
using System;
namespace Program
{
class Program
{
static void Main()
{
int a, b;
int m = 1;
int min = 0, max = 0;
int n = 0;
Console.Write(«Zadaite diapazon ot «);
a = Convert.ToInt32(Console.ReadLine());
Console.Write(» do «);
b = Convert.ToInt32(Console.ReadLine());
for (int i = a; i<=b; i++)
{
for (int j = a; j m)
{
m = n;
min = i;
}
else if (n == m)
{
max = i;
}
n = 0;
}
Console.WriteLine(«Chisla s naibolshim kolichestvom delitelei Max {0} i Min {1}», max, min);
}
}
}
Y3. Вложенные циклы и целые числаЧасть 1
Y3.6. Найти натуральное число из интервала от a до b, у которого количество делителей максимально. Если таких чисел несколько, то должно быть найдено:
а) максимальное из них;
б) минимальное из них.
Фуф, пришлось нормально так посидеть за этой задачкой, которую, видимо, все скипали:) Только не кидайтесь камнями за «maxNumbers[maxNumbers.Count — 1]». Я знаю, что можно написать короче, но из за версии C# не получилось.
Y3.24. Дано натуральное число n (n < 100).
а) Определить число способов выплаты суммы n рублей с помощью монет достоинством 1, 2, 5 рублей и бумажных купюр достоинством 10 рублей.
б) Получить все способы выплаты (указать, какие монеты и купюры и в каком количестве следует использовать).
Как то так вышло, тут решение и а и б вопроса.
Y 3.3 решение. Так же функционал программы позваляет легко добавить функционал ввода с клавиатуры всего двух переменных для проверки любых чисел на любое колличество делений нацело.
хотел сделать с помощью массивов но выводится одни 0
то-есть в массиве были 0
кто то может обьяснить?
Найти все целые числа из промежутка от 300 до 600, у которых сумма делителей кратна 10.
< static void Main(string[] args)
{
List<int> list = new List<int>();
int a,b,c;
a = 300;
b = 600;
c = 1;
int result = 0;
for (; a <= b;a++)
{
for (; c <= a;c++)
{
if (a % c == 0)
{
result += c;
}
}
list.Add(result);
result = 0;
c = 1;
}
for (int i = 0; i < list.Count; i++)
{
if (list[i] % 10 == 0)
{
Console.Write(list[i] + » «);
}
}
Console.ReadLine();
}/>
Y3.8. Найти 100 первых простых чисел.
Алексей В, хорошо, но можно значительно упростить алгоритм:
Решение не верно. Выходят лишние цифры
Мой вариант.
int num = 0;
for (int i = 2; i <= 100; i++)
{
for (int j = 1; j <= i / 2; j++)
{
if (i % j == 0)
{ num++; }
}
if (num == 1)
{
Console.WriteLine(i);
}
num = 0;
}
Y3.33. Даны целые числа p и q. Получить все делители числа q, взаимно простые с p.
Михаил, направление верно, но:
— границы допустимых значений указаны не верно
— в некоторых случаях (прямо в том, что вы написали) — ответ не верен
— метод «Evklid» имеет плохое имя
Y3.32. Даны целые числа n и m. Получить все натуральные числа, меньшие n и взаимно простые с p.
Михаил, все верно. Только «n» и «p» все таки могут быть 1.
Y3.31. Дано натуральное число n. Получить все натуральные числа, меньшие n и взаимно простые с ним (два натуральных числа называются взаимно простыми, если их наибольший общий делитель равен 1).
Михаил, все верно. Подумайте как можно правильней назвать метод: «Evklid».
Y3.30. Дано натуральное число n. Получить все простые делители этого числа.
Скобки pre /pre не работают !!!
Михаил, хорошо. Задача решена верно, по подумайте над читаемостью: например, как лучше назвать метод «proverka»?
Y3.29. Дано натуральное число n. Напечатать разложение этого числа на простые множители. Реализовать два варианта:
1) каждый простой множитель должен быть напечатан один раз;
2) каждый простой множитель должен быть напечатан столько раз, сколько раз он входит в разложение.
Михаил, что это? Вы это проверяли? Код не верен.
Y3.28. Старинная задача. Имеется 100 рублей. Сколько быков, коров и телят можно купить на все эти деньги, если плата за быка — 10 рублей, за корову — 5 рублей, за теленка — полтинник (0,5 рубля) и надо купить 100 голов скота?
Михаил, верно, но:
— имена плохие
— код запутанный (неясно сразу откуда взялось 10, 20, 200, …)
— код хрупкий (поменяв любое число в условии, пол программы прийдется править)
— надежнее и понятнее будет, если в начале константами будет определено что дано (100 рублей, 100 голов, 10, 5, 0.5) и из этого будут выводиться все другие значения, а не вставляться выведенные хардкоды
Y3.27. Составить программу нахождения цифрового корня натурального числа. Цифровой корень данного числа получается следующим образом. Если сложить все цифры этого числа, затем все цифры найденной суммы и повторять этот процесс, то в результате будет получено однозначное число (цифра), которая и называется цифровым корнем данного числа.
Михаил, все верно.
Y3.26. В некоторой стране используются денежные купюры достоинством в 1, 2, 4, 8, 16, 32 и 64. Дано натуральное число n. Как наименьшим количеством таких денежных купюр можно выплатить суммы n, n + 1, …, n + 10 (указать количество каждой из используемых для выплаты купюр)? Предполагается, что имеется достаточно большое количество купюр всех достоинств.
Михаил, верно. Только нужно для n, n+1, …
Y3.25. Даны натуральные числа m и n. Получить все натуральные числа, меньшие n, квадрат суммы цифр которых равен m.
Михаил, в вашем решении много ошибок. Даже переменные некоторые не объявлены. Цикл с ошибкой тоже.
Но в целом просматривается начало движения в нужном направлении.
Напишите пожалуйста, когда почините тег
Михаил, хорошо!
Y3.22. Даны n натуральных чисел. Найти их наибольший общий делитель, используя алгоритм Евклида и учитывая, что НОД(a, b, c) = НОД(НОД(a, b), c).
Михаил, вот:
— алгоритм Эвклида можно записать проще для понимания читателя
— нужно решить задачу для общего случая n > 0 чисел
Y3.21. Напечатать в возрастающем порядке все трехзначные числа, в десятичной записи которых нет одинаковых цифр. Операции деления, целочисленного деления и определения остатка не использовать.
Михаил, все верно.
Y3.20. Дано натуральное число n (n ≤ 27). Найти все трехзначные числа, сумма цифр которых равна n. Операции деления, целочисленного деления и определения остатка не использовать.
Михаил, правильно. Только зачем «n» условие в первом цикле?
Да, здесь это явно лишнее.
Y3.19. Дано натуральное число n. Вычислить 11 + 22 + … + nn.
Михаил, слишком сложно.
Подсказка: цикл должен быть один.
Исправил
МИХАИЛ, все верно.
Y3.18. Даны натуральные числа m и n. Вычислить 1n + 2n + … + mn.
Михаил, слишком сложно.
Подсказка: цикл должен быть один.
Исправил.
Михаил, почти. С центральным условием в цикле что-то не то :)
Из за того что оформление кода не работает «pre», код отображается некорректно …
Михаил, да, вижу. Думаю мы скоро решим эту проблему.
Y3.17. Составить программу для нахождения всех натуральных решений (x и y) уравнения x2 + y2 = k2, где x, y и k лежат в интервале от 1 до 30. Решения, которые получаются перестановкой x и y, считать совпадающими.
МИХАИЛ, данное решение и не верно и не оптимально.
По оптимальности: у вас общая проблема во всех подобных задачах: по площади, объему и вот здесь по сумме квадратов. Вам нужно пересмотреть оптимальность решения.
Подсказка: в случае, где нужно вывести результат без перестановок (совпадений или повторений) в симметричных задачах — нет смысла каждый вложенный цикл начинать с 1.
П.С. Пожалуйста, заворачивайте ваш код в тег «pre», что бы он корректно отображался.
Исправил задачу.
Заворачиваю код в тег так, как вы и сказали, но все равно отображается неправильно…
Михаил, много опечаток и ошибок. оформите код к здаче.
Y3.16. Найти размеры всех прямоугольных параллелепипедов, объем которых равен заданному натуральному числу v и стороны которых выражены натуральными числами. При этом решения, которые получаются перестановкой размеров ребер параллелепипеда:
а) считать разными;
б) считать совпадающими.
Решил алгоритмом лоб в лоб, до другого пока что не додумался.
A) считать разными;
б) считать совпадающими.
МИХАИЛ, случай «А» — хорошо. В случае «Б» — явно что-то не то, и по коду и по решению самому.
Переделал случай Б.
Заключаю код в …, не срабатывает.
МИХАИЛ, вы проверяли решение? В нем явно много ошибок и опечаток. Проверьте пожалуйста сами, код не готов к сдаче.
ПОДСКАЗКА: не всегда цикл нужно начинать с 1.
Y3.16. Найти размеры всех прямоугольных параллелепипедов, объем которых равен заданному натуральному числу v и стороны которых выражены натуральными числами. При этом решения, которые получаются перестановкой размеров ребер параллелепипеда:
а) считать разными;
б) считать совпадающими.
static void main
МИХАИЛ, продолжение будет?
Y3.15. Найти размеры всех прямоугольников, площадь которых равна заданному натуральному числу s и стороны которых выражены натуральными числами. При этом решения, которые получаются перестановкой размеров сторон:
а) считать разными;
б) считать совпадающими.
Не сработали pre..
Исправил. Нужно вот так:
<pre>...code...</pre>
МИХАИЛ, все верно.
Советы:
— назвать переменные понятнее (square, width, height) или как в задаче (s,a,b)
— выделять переменные ширины и высоты в коде. Сейчас у вас везде используется например «n/i»
— заключать if-блоки в фигурные скобки. Это самое популярное общепринятое соглашение. Повышает читаемость
Удачи в изучении материала
Вот так лучше оформление ?
МИХАИЛ, однозначно.
Вот дополнения:
— у вас пропущен один случай, фактически баг (bug, ошибка)
— лучше не объявляйте переменные в одну строку
— инициализацию переменной «height» можно делать один раз и на уровень выше, чем вы делаете
— тогда можно упростить условие if
— объявлять «height» можно без инициализации и на шаг позже (объявлять нужно только тогда, когда нужно), вам по идее это должна среда разработки подчеркивать/подсказывать
— я бы не совмещал два случая («а» и «б») в одном решении, тогда if-конструкции будут проще и читаться легче
Поправил.
Вариант A — Считать разными.
Вариант Б — Считать совпадающими.
Михаил, в варианте «Б» второй «if» лишний. А в целом — решение теперь верное и оформлено достойно.
И даже обработан один граничный случай (corner case: square <= 0).
Второй граничный случай, как я правильно понимаю это максимальное значение типа данных int ?
Михаил, в вашем случае он один. Вы не сможете ввести значение переменной больше чем максимальный int. Будет ошибка компиляции.
Но, если бы ввод площади был сделан с клавиатуры (ReadLine и т.д.) + парсинг строки — тогда крайних случаев бы добавилось точно :) И это был бы вариант программы больше приближенный к реальному использованию.
И еще вы написали, что в варианте Б можно убрать второй if, вот не понял насчет его.
Михаил, да. В случае «Б» второй «if» — это фактически случай «А», но он уже рассмотрен. Его нужно просто убрать.
Y3.14. Два натуральных числа называются дружественными, если каждое из них равно сумме всех делителей другого (само другое число в качестве делителя не рассматривается). Найти все пары натуральных дружественных чисел, меньших 50 000.
static int SumOfDividers(int n)
{
var sum = 0;
for (int i = 1; i < n / 2 + 1; i++)
{
if (n % i == 0) sum += i;
}
return sum;
}
static void Main(string[] args)
{
for (int i = 20; i <= 40; i++)
{
for (int j = 20; j <= 40; j++)
{
if (i != j && SumOfDividers(i) == SumOfDividers(j))
Console.WriteLine($"{i} — {j}");
}
}
}
Y3.13. Найти натуральное число из интервала от a до b с максимальной суммой делителей.
int storage = 0, max = 0, answer = 0, j, i;
Console.WriteLine(«Введите n»);
int n = int.Parse(Console.ReadLine());
for (i = 1; i <= n; i++)
{
for (j = 1; j max)
{
max = storage;
answer = i;
}
storage = 0;
}
Console.WriteLine(«Ответ: {0} «, answer);
Console.ReadKey();
Y3.12. Натуральное число называется совершенным, если оно равно сумме своих делителей, включая 1 и, естественно, исключая это самое число. Например, совершенным является число 6 ( 6 1 2 3 ). Найти все совершенные числа, меньшие 100 000.
int sum;
for (int i = 1; i < 10000; i++)
{
sum = 0;
for (int j = 1; j < 10000; j++)
{
if (i % j == 0)
{
sum = sum + j;
if (sum == i)
{
Console.WriteLine(i + " ");
}
}
}
}
Y3.9 Найти сумму делителей каждого из целых чисел от 50 до 70.
int sum = 0;
for (int i = 50; i < 70; i++)
{
for (int j = 1; j < i; j++)
{
if (i % j == 0)
sum += j;
}
}
Console.WriteLine("Сумма делителей чисел от 50 до 70: "+sum);
Console.ReadKey();
задание заключается в том, что найти сумму делителей отдельно для каждого числа, а не для всех вместе
Y3.8. Найти 100 первых простых чисел.
static void Main(string[] args)
{
int sum = 0;
int n = int.Parse(Console.ReadLine());
for (int i = 2; i <= n; i++)
{
if (isSimple(i))
{
if (sum < 100)
{
sum++;
Console.Write(i.ToString() + ",");
}
}
}
}
private static bool isSimple(int n)
{
for (int i = 2; i < (int)(n / 2); i++)
{
if (n % i == 0)
return false;
}
return true;
}
Y.3.2
Console.Write(«Ведите количество строк: «);
int a = int.Parse(Console.ReadLine());
string str = «»;
for (int i = 1; i <= a; i++)
{
str = str + "+";
Console.Write(i + "" + str + '\n');
}
Y3.18. Даны натуральные числа m и n. Вычислить 1n + 2n + … + mn.
Кирилл, экономная реализация.
Y3.21. Напечатать в возрастающем порядке все трехзначные числа, в десятичной записи которых нет одинаковых цифр. Операции деления, целочисленного деления и определения остатка не использовать.
Все точно и лаконично.
Y3.10. Найти все целые числа из промежутка от 100 до 300, у которых сумма делителей равна 50.
Отмечу, что Денис не обратил внимания на указание вначале раздела Y3, что все делители должны быть больше 1 и меньше самого числа (видно из примера: 12=2*2*3). Его ответ — нет таких чисел. Но с учетом этого замечания, решение есть.
Тогда вместо
for (a = 1; a <= i; a++); следует написать for (a = 2; a < i; a++); В ответе будет одно число - 141 (3*47). Сумма 3+47=50.
Y3.7. Найти все трехзначные простые числа (простым называется натуральное число, большее 1, не имеющее других делителей, кроме единицы и самого себя).
Денис! Конечно, это самый простой переборный алгоритм. Более эффективный описан в примере.
Y3.3. Найти все целые числа из промежутка от 1 до 300, у которых ровно пять делителей.
Денис, верно, если в число делителей включать 1. Если нет, то внутренний цикл следует начинать с 2.
static void Main(string[] args)
{
for (int i = 1; i < 300; i++)
if (DelimCount(i) == 5)
Console.Write(i + " ");
Console.ReadKey();
}
static int DelimCount(int i)
{
int count = 0;
for (int a = 1; a < i; a++)
if (i % a == 0)
count++;
return count;
}
Y3.1. Найти количество делителей каждого из целых чисел от 120 до 140.
Денис, верно, если в число делителей включать 1. Если нет, то внутренний цикл следует начинать с 2.
Y3.2. Составить программу для графического изображения делимости чисел от 1 до n (значение n вводится с клавиатуры). В каждой строке надо напечатать очередное число и столько символов «+», сколько делителей у этого числа. Например, если n = 4, то на экране должно быть напечатано:
1+
2++
3++
4+++
Денис, верно.
Console.Write(«Ведите количество строк: «);
int a = int.Parse(Console.ReadLine());
string str = » «;
for (int i = 1; i <= a; i++)
{
str = str + "+";
Console.Write(i + "" + str + '\n');
}