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! = 3628800 -> 2
N = 20 -> N! = 2432902008176640000 -> 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

← Обратно