Задача 5.
#include <iostream> using namespace std; unsigned int fibonachi(unsigned int n, unsigned int *foudned); int main() { int k, n; std::cout << "Input k: "; std::cin >> k; std::cout << std::endl; // Масив, в който ще се запомнят намерените числа unsigned int foudnedArray[5000] = {0}; for( int i=1; i<=k; i++ ) { std::cout << "fibonachi(" << i << "): " << fibonachi(i, foudnedArray) << std::endl;; } return 0; } unsigned int fibonachi(unsigned int n, unsigned int *foudned) { // Ако е 1-то или 2-то число на фибоначи (условие за край) if( n <= 2 ) return 1; // Ако числото вече е било намерено(условие за край) if( foudned[n] > 0 ) return foudned[n]; // Променлива, в която се запомня търсеното число unsigned int fibonachiNum; // Прави се рекурсивно извикване, за да се намери числото fibonachiNum = fibonachi(n-1, foudned) + fibonachi(n-2, foudned); // Запомня намереното n-то число на съответната позиция в масива foudned[n] = fibonachiNum; return fibonachiNum; }
Задача 6.
#include <iostream> using namespace std; unsigned int factoriel(unsigned int n); int main() { unsigned int a, b; do { std::cout << "Input a: "; std::cin >> a; std::cout << "Input b: "; std::cin >> b; std::cout << std::endl; if( b > a && a >= 0 ) break; std::cout << "Incorect values for a,b!" << std::endl; } while(true); unsigned long long int result; result = (factoriel(a) + factoriel(b) ) / (b - a); std::cout << "R = (" << a << "!+" << b << "!)/(" << b << " − " << a << ") = " << result << std::endl;; return 0; } unsigned int factoriel(unsigned int n) { // Ако n е 1 или 0, то стойността е 1 (условие за край) if( n < 2 ) return 1; return n*factoriel(n-1); }
Задача 7.
#include <iostream> using namespace std; double pow_rec(double a, int n); int main() { unsigned int a, b, c, k, p, r; std::cout << "Input a: "; std::cin >> a; std::cout << "Input b: "; std::cin >> b; std::cout << "Input c: "; std::cin >> c; std::cout << "Input k: "; std::cin >> k; std::cout << "Input p: "; std::cin >> p; std::cout << "Input r: "; std::cin >> r; std::cout << std::endl; // Променливи, в които ще се изчислят числителя и знаменателя double numerator, denumerator; numerator = pow_rec(a+b, k); denumerator = pow_rec(a, p) - pow_rec(c, r); // Проверява се знаменателя да не е нула if( 0 == denumerator ) { std::cout << "Denominator (a^p − c^r) = (" << a << "^" << p << "-" << c << "^" << r << ") = 0 !" << std::endl; } else { std::cout << "R = (a + b)^k / (a^p − c^r) = " << "(" << a << "+" << b << ")^" << k // числителя << " / " << "(" << a << "^" << p << "-" << c << "^" << r << ")" // знаменателя << " = " << numerator/denumerator << std::endl; } return 0; } /** * Намира степента на a ^ n * * @param double a * @param int n * @return double */ double pow_rec(double a, int n) { if( n == 0 ) return 1.0; if( n < 0 ) return 1/pow_rec(a, -n); return (double)(a*pow_rec(a, n-1)); }
Задача 8.
#include <iostream> using namespace std; int nod_rec(int a, int b); int main() { unsigned int n; std::cout << "Input n: "; std::cin >> n; std::cout << std::endl; int nod; for (int i=0; i<n; i++) { int num; do { std::cout << "Input number " << i+1 << ": "; std::cin >> num; if( 0 != num ) break; std::cout << "Number can not be 0! " << std::endl; } while(true); if( num < 0 ) num = -num; if( 0 == i) { nod = num; } else { nod = nod_rec(nod, num); } } std::cout << "NOD = " << nod << std::endl; return 0; } /** * Намира НОД(a,b) * * @param int a * @param int b * @return int */ int nod_rec(int a, int b) { if( a == b ) return a; if( a > b ) return nod_rec(b, a-b); else return nod_rec(a, b-a); }
Задача 9.
#include <iostream> using namespace std; void inputNumbers(int *numbers, int &size); bool binary_check(int number); int main() { int numbers[90], numbersCnt; // Въвежда числата inputNumbers(numbers, numbersCnt); for(int i=0; i<numbersCnt; i++){ if( numbers[i] > 0 && binary_check(numbers[i]) ){ std::cout << numbers[i] << " "; } } std::cout << std::endl; return 0; } /** * Въвежда масива с числата * * @param int[] numbers * @param int cnt * @return void */ void inputNumbers(int *numbers, int &cnt) { std::cout << "Input numbers size: "; std::cin >> cnt; std::cout << std::endl; int i=0, *pNumbers; pNumbers = numbers; while(i<cnt) { std::cout << "numbers[" << i << "] = "; std::cin >> *pNumbers++; i++; } std::cout << std::endl; } /** * Намира НОД(a,b) * * @param int a * @param int b * @return int */ bool binary_check(int number) { if( 0 == number ) return true; if( number%2 == 1 ) { return !binary_check(number/2); } return binary_check(number/2); }
Задача 10.
#include <iostream> #include <cmath> using namespace std; bool is_prime_rec(unsigned number, unsigned divisor); int main() { int intervalBegining, intervalEnd; std::cout << "Input begining number for interval:"; std::cin >> intervalBegining; std::cout << "Input end number for interval:"; std::cin >> intervalEnd; std::cout << std::endl; if( intervalBegining > intervalEnd ) { std::cout << "Error input:\nEnd of interval muss be greater then the begining!\n"; } while( intervalBegining <= intervalEnd ){ if( intervalBegining >= 2 ) { unsigned divisor = sqrt(intervalBegining); if( is_prime_rec(intervalBegining, divisor) ) { std::cout << intervalBegining <<", "; } } intervalBegining++; } std::cout << std::endl; return 0; } /** * Намира дали дадено естествено число е просто * * @param unsigned number * @param unsigned divisor * @return bool */ bool is_prime_rec(unsigned number, unsigned divisor) { // Проверка за коректност на данните if( number < 2 || divisor < 1 ) return false; // Ако делителят е станал 1-ца, без да е делил числото, то е просто if( 1 == divisor ) return true; // Ако текущият делител дели числото, то не е просто и връща false // В противен случай се връща стойността от същата функция, извикана // със стойност за делителя, намалена с единица if( number%divisor == 0 ) { return false; } else { return is_prime_rec(number, divisor-1); } }
Задача 11.
#include <iostream> using namespace std; void inputNumbers(int *numbers, int &size); double sum_even_indexes_rec(int *numbers, int size, int currentPos); int main() { int numbers[90], size; // Въвежда числата inputNumbers(numbers, size); // Ако размерността (брояt на елементите) на масива е по-малко от 2, то няма четни индекси if( size < 2 ) { std::cout << "Not found even indexes!" << std::endl; return 0; } // Рекурсивното извикване започва с индекс 2 std::cout << "Sum even indexes: " << sum_even_indexes_rec(numbers, size, 2); std::cout << std::endl; return 0; } /** * Въвежда масива с числата * * @param int[] numbers * @param int size * @return void */ void inputNumbers(int *numbers, int &size) { std::cout << "Input numbers size: "; std::cin >> size; std::cout << std::endl; int i=0, *pNumbers; pNumbers = numbers; while(i<size) { std::cout << "numbers[" << i << "] = "; std::cin >> *pNumbers++; i++; } std::cout << std::endl; } /** * Намира сумата на елементите на масива с четни индекси и я връща като резултат * * @param int numbers (указател към масива с числата) * @param int size (размерността на масива) * @param int shift (задава отместването към съответния четен индекс) * @return double */ double sum_even_indexes_rec(int *numbers, int size, int shift) { if( shift >= size ) return 0.0; return *(numbers+shift) + sum_even_indexes_rec(numbers, size, shift+2); }