C# For Dummies
Глава 6. Цикли
1. Напишете програма, която отпечатва на конзолата числата от 1 до N. Числото N трябва да се чете от стандартния вход.
Упътване: Използвайте
for
цикъл.
Решение:
static void Main(string[] args)
{
Console.Write("Enter first number: ");
int length = Int32.Parse(Console.ReadLine());
for (int i = 1; i < length; i++)
Console.WriteLine(i);
}
2. Напишете програма, която отпечатва на конзолата числата от 1 до N, които не се делят едновременно на 3 и 7. Числото N да се чете от стандартния вход.
Упътване: Използвайте
for
цикъл и оператора % за намиране на остатък при целочислено деление. Едно число num не се дели на 3 и на 7 едновременно, ако
(num % (3*7) == 0)
.
Решение:
Link
3. Напишете програма, която чете от конзолата поредица от цели числа и отпечатва най-малкото и най-голямото от тях.
Упътване: Първо прочетете броя числа, примерно в променлива
n
. След това въведете
n
числа последователно с един
for
цикъл. Докато въвеждате всяко следващо число запазвайте в две променливи най-малкото и най-голямото число до момента.
Решение:
Link
4. Напишете програма, която отпечатва всички възможни карти от стандартно тесте карти без джокери (имаме 52 карти: 4 бои по 13 карти).
Упътване: Номерирайте картите от 2 до 14 (тези числа ще съответстват на картите от 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A). Номерирайте боите от 1 до 4 (1 – спатия, 2 – каро, 3 – купа, 4 – пика). Сега вече можете да завъртите 2 вложени цикъла и да отпечатате всяка от картите.
Решение:
Link
5. Напишете програма, която чете от конзолата числото N и отпечатва сумата на първите N члена от редицата на Фибоначи: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...
Упътване: Числата на Фибоначи започват от 0 и 1, като всяко следващо се получава като сума от предходните две. Можете да намерите първите
n
числа на Фибоначи с
for
цикъл от 1 до
n
, като на всяка итерация пресмятате поредното число, използвайки предходните две (които ще пазите в две допълнителни променливи).
Решение:
Link
6. Напишете програма, която пресмята N!/K! за дадени N и K (1 < k < N).
Упътване: Умножете числата от K+1 до N.
Решение:
static void Main(string[] args)
{
Console.Write("Enter N: (1<K<N) ");
int n = Int32.Parse(Console.ReadLine());
Console.Write("Enter K: (1<K<N) ");
int k = Int32.Parse(Console.ReadLine());
for (int i = n - 1; i > 0; i--)
{
n *= i;
}
for (int i = k - 1; i > 0; i--)
{
k *= i;
}
n /= k;
Console.WriteLine("Result is {0}", n);
}
7. Напишете програма, която пресмята N!*K!/(N-K)! за дадени N и K (1 < K < N).
Упътване: Вариант за решение е поотделно да пресмятате всеки от факториелите и накрая да извършвате съответните операции с резултатите. Помислете как можете да оптимизирате пресмятанията, за да не смятате прекалено много факториели! При обикновени дроби, съставени от факториели има много възможности за съкращение на еднакви множители в числителя и знаменателя. Тези оптимизации не само ще намалят изчисленията и ще увеличат производителността, но ще ви избавят и от препълвания в някои ситуации.
Решение:
Link
8. В комбинаториката числата на Каталан (Catalan’s numbers) се изчисляват по следната формула:
, за n ≥ 0.
Напишете програма, която изчислява n-тото число на Каталан за дадено n.
Упътване: Погледнете предходната задача.
Решение:
Link
9. Напишете програма, която за дадено цяло число n, пресмята сумата:
Упътване: Задачата може да решите с
for
-цикъл за
k=0…n
, като ползвате три допълнителни променливи
factoriel, power
и
sum
, в които да пазите за
k
-тата итерация на цикъла съответно
k!, xk
и сумата на първите
k
члена на редицата. Ако реализацията ви е добра, Трябва да имате само един цикъл и не трябва да ползвате външни функции за изчисление на факториел и за степенуване.
Решение:
static void Main(string[] args)
{
int sum = 1, temp = 1;
Console.Write("Enter n: ");
int n = Int32.Parse(Console.ReadLine());
Console.Write("Enter x: ");
int x = Int32.Parse(Console.ReadLine());
for (int i = 1; i <= n; i++)
{
temp *= i / x;
sum += temp;
}
Console.WriteLine("Result is {0}", sum);
}
10. Напишете програма, която чете от конзолата положително цяло число N (N < 20) и отпечатва матрица с числа като на фигурата по-долу:
Упътване: Трябва да използвате два вложени цикъла, по подобие на задачата за отпечатване на триъгълник с числа. Външният цикъл трябва да върти от 1 до N, а вътрешният – от стойността на външния до стойността на външния + N - 1.
Решение:
static void Main(string[] args)
{
Console.Write("Enter N: (N < 20) ");
int n = Int32.Parse(Console.ReadLine());
for (int i = 1; i <= n; i++)
{
for (int j = i; j <= i; j++)
{
Console.Write("{0} ", j);
}
Console.WriteLine();
}
}
11. Напишете програма, която пресмята с колко нули завършва факториелът на дадено число. Примери:
N = 10 -> N! = 36288
00 -> 2
N = 20 -> N! = 243290200817664
0000 -> 4
Упътване: Броят на нулите в края на n! зависи от това, колко пъти числото 10 е делител на факториела. Понеже произведението 1*2*3…*n има повече на брой делители 2, отколкото 5, а 10 = 2 * 5, то броят нули в n! е точно толкова, колкото са множителите със стойност 5 в произведението 1*2*3….*n. Понеже всяко пето число се дели на 5, а всяко 25-то число се дели на 5 двукратно и т.н., то броя нули в n! е сумата: n/5 + n/25 + n/125 + …
Решение:
static void Main(string[] args)
{
Console.Write("Enter N: ");
decimal n = Int32.Parse(Console.ReadLine());
int zeroes = 0;
for (int i = (int)(n - 1); i > 0; i--)
n *= i;
Console.Write("N! is {0} and it ends ", n);
do
{
n /= 10;
zeroes++;
} while (n % 10 == 0);
Console.WriteLine("with {0} zeroes.", zeroes);
}
12. Напишете програма, която преобразува дадено число от десетична в двоична бройна система.
Упътване: Прочетете в Уикипедия какво представляват бройните системи.
Решение:
static void Main(string[] args)
{
Console.Write("Enter number: ");
int n = Int32.Parse(Console.ReadLine());
string binary = Convert.ToString(n, 2);
Console.WriteLine("Result is {0}", binary);
}
13. Напишете програма, която преобразува дадено число от двоична в десетична бройна система.
Упътване: Погледнете предходната задача.
Решение:
static void Main(string[] args)
{
Console.Write("Enter binary number: ");
int n = Int32.Parse(Console.ReadLine());
string toDecimal = Convert.ToString(Convert.ToInt32(n, 2), 10);
Console.WriteLine("Result is {0}", toDecimal);
}
14. Напишете програма, която преобразува дадено число от десетична в шестнайсетична бройна система.
Упътване: Погледнете предходната задача.
Решение:
static void Main(string[] args)
{
Console.Write("Enter decimal number: ");
int n = Int32.Parse(Console.ReadLine());
string toDecimal = Convert.ToString(Convert.ToInt32(n, 10), 16);
Console.WriteLine("Result is {0}", toDecimal);
}
15. Напишете програма, която преобразува дадено число от шестнайсетична в десетична бройна система.
Упътване: Погледнете предходната задача.
Решение:
static void Main(string[] args)
{
Console.Write("Enter decimal number: ");
int n = Int32.Parse(Console.ReadLine());
string toDecimal = Convert.ToString(Convert.ToInt32(n, 16), 10);
Console.WriteLine("Result is {0}", toDecimal);
}
16. Напишете програма, която по дадено число N отпечатва числата от 1 до N, разбъркани в случаен ред.
Упътване: Потърсете в Интернет информация за класа
System.Random
. Прочетете в Интернет за масиви. Направете масив с N елемента и запишете в него числата от 1 до N. След това достатъчно много пъти (помислете точно колко) разменяйте двойки случайни числа от масива.
string
.
Решение:
Link
17. Напишете програма, която за дадени две числа, намира най-големия им общ делител.
Упътване: Потърсете в интернет за алгоритъма на Евклид.
Решение:
static void Main(string[] args)
{
Console.Write("Enter first number: ");
int a = Int32.Parse(Console.ReadLine());
Console.Write("Enter second number: ");
int b = Int32.Parse(Console.ReadLine());
while (a != 0 && b != 0)
{
if (a > b) a %= b;
else b %= a;
}
if (a == 0) Console.WriteLine(b);
else Console.WriteLine(a);
}
18. Напишете програма, която по дадено число n, извежда матрица във формата на спирала. Пример при n=4:
1 |
2 |
3 |
4 |
12 |
13 |
14 |
5 |
11 |
16 |
15 |
6 |
10 |
9 |
8 |
7 |
Упътване: Трябва да използвате двумерен масив.
Решение:
Link
← Обратно