Professional Documents
Culture Documents
Nếu bạn chưa biết thì S(n) có thể tính nhanh bằng
công thức S(n) = n * (n + 1) / 2:
#include <stdio.h>
#include <math.h>
if(n == 1) return 1;
int main(){
printf("%d", tong(n));
Tính tổng hàm S(n) = 1^2 + 2^2 + 3^2 + 4^2 + .. + n^2 bằng đệ quy. Nếu bạn chưa biết thì S(n) có thể tính
nhanh bằng công thức S(n) = n * (n + 1) * (2n + 1) / 6:
#include <stdio.h>
#include <math.h>
if(n == 1) return 1;
int main(){
printf("%d", tong(n));
Tính tổng hàm S(n) = 1^3 + 2^3 + 3^3 + 4^3 + .. + n^3 bằng đệ quy. Nếu bạn chưa biết thì S(n) có thể tính
nhanh bằng công thức S(n) = [(n * (n + 1) / 2)]^2:
#include <stdio.h>
#include <math.h>
long long tong(int n){
if(n == 1) return 1;
int main(){
printf("%lld", tong(n));
Tính tổng hàm S(n) = -1 + 2 -3 + 4 - 5 + 6 + ... + (-1)^n * n bằng đệ quy. Nếu bạn chưa biết thì
S(n) có thể tính nhanh bằng công thức Nếu N chẵn thì S(n) = n / 2, còn nếu N lẻ thì S(n) = (n -
1) / 2 – n :
#include <stdio.h>
#include <math.h>
long long tong(int n){
if(n == 1) return -1;
if(n % 2 == 0) return n + tong(n - 1);
else return - n + tong(n - 1);
}
int main(){
int n; scanf("%d", &n);
printf("%lld", tong(n));
}
Tính n giai thừa bằng đệ quy.:
#include <stdio.h>
#include <math.h>
long long gt(int n){
if(n == 0) return 1;
return n * gt(n - 1);
}
int main(){
int n; scanf("%d", &n);
printf("%lld", gt(n));
}
Dãy số fibonacci là dãy số thỏa mãn : F1=0, F2=1, Fn=Fn-1+Fn-2. Hãy tìm số Fibonacci thứ n sử
dụng đệ quy. Độ phức tạp của code đệ quy là O(1.618^n) không thể áp dụng được với n lớn.:
#include <stdio.h>
#include <math.h>
int fibo(int n){
if(n == 1 || n == 2) return n-1;
return fibo(n - 1) + fibo(n - 2);
}
int main(){
int n; scanf("%d", &n);
printf("%d", fibo(n));
}
Cho 2 số nguyên dương N và K. Hãy tính tổ hợp chập K của N. Tiện thể các bạn ôn lại một vài
tính chất của tổ hợp chập K của N nhé.:
#include <stdio.h>
#include <math.h>
//to hop chap k cua n co: n = 1 khi k = 0 or k = n; k - 1 = k(trong kCn)
int tohop(int n, int k){
if(k == 0 || n == k) return 1;
return tohop(n - 1, k - 1) + tohop(n - 1, k);
}
int main(){
int n, k; scanf("%d %d", &n, &k);
printf("%d", tohop(n, k));
}
Cho 2 số a và b, hãy tính ước chung lớn nhất và bội chung nhỏ nhất của 2 số a và b. Trong đó
hàm UCLN sử dụng đệ quy để tính.:
#include <stdio.h>
#include <math.h>
#define ll long long
//dung ct ucln = (b, a % b) va th dau ucln = a khi b == 0
// bcnn = (a*b) // ucln
ll gcd(int a, int b){
if(b == 0) return a;
return gcd(b, a % b);
}
ll lcm (int a, int b){
return a / gcd(a, b) * b; // chia truoc de tranh tran
}
int main(){
ll a, b; scanf("%lld %lld", &a, &b);
printf("%lld %lld", gcd(a, b), lcm(a, b));
}
Tính tổng S(n) = 1/1 + 1/2 + 1/3 + ... + 1/n bằng đệ quy.:
double tongtp(int n){
if(n == 1) return 1;
return 1.0/n + tongtp(n - 1);
//tongtp() la phan de quy goi lai 1/n-1
}
Cho một số nguyên không âm N, hãy in ra dạng biểu diễn nhị phân của số N.:
#include <stdio.h>
#include <math.h>
void dq(long long n){
if(n < 2) printf("%lld", n);
else{
dq(n / 2);
printf("%lld", n % 2);
}
}
int main(){
long long n; scanf("%lld", &n);
dq(n);
}
Cho một số nguyên không âm N, hãy in ra dạng biểu diễn của N dưới hệ 16.:
#include <stdio.h>
#include <math.h>
// doi sang he 16 : dung n + 55(de doi qua ma asci in hoa)
void dq(long long n){
if(n < 16) {
if(n <= 9) printf("%d", n);
else printf("%c", n + 55);
}
else{
//dung bien r tim phan du cung theo ma asci
dq(n / 16);
int r = n % 16;
if(r <= 9) printf("%d", r);
else printf("%c", r + 55);
}
}
int main(){
long long n; scanf("%lld", &n);
dq(n);
}
Cho một số nguyên không âm N, hãy tính tổng chữ số của N sử dụng kỹ thuật đệ quy.:
#include <stdio.h>
#include <math.h>
#define ll long long
//goi ham tong chu so
ll tcs(ll n){
if(n < 10) return n;
else {
return n % 10 + tcs(n / 10);
}
}
int main(){
ll n; scanf("%lld", &n);
printf("%d", tcs(n));
}
Cho một số nguyên không âm N, hãy đếm số lượng chữ số của N.:
#include <stdio.h>
#include <math.h>
#define ll long long
//goi ham dem chu so
ll dcs(ll n){
int cnt = 0;
if(n < 10) return 1; // hang donvi tra ve 1
else {
return ++cnt + dcs(n / 10);
}
}
int main(){
ll n; scanf("%lld", &n);
printf("%d", dcs(n));
}
Cho một số nguyên không âm N, hãy in ra chữ số đầu tiên của N.:
#include <stdio.h>
#include <math.h>
#define ll long long
//goi ham in chu so
ll ics(ll n){
if(n < 10) return n;
else return ics(n / 10);// khi n = 1 vao vong if return dap an
}
int main(){
ll n; scanf("%lld", &n);
printf("%d", ics(n));
}
Cho một số nguyên không âm N, hãy in ra chữ số lớn nhất và chữ số nhỏ nhất của N.:
#include <stdio.h>
#include <math.h>
#define ll long long
// goi ham tim so nho nhat
int mindigit(ll n){
if(n < 10) return n;
return fmin(n % 10, mindigit(n / 10));
}
Cho số nguyên không âm N, hãy tính tổng các chữ số chẵn, tổng các chữ số lẻ của N.:
#include <stdio.h>
#include <math.h>
#define ll long long
int tongchan(ll n){
if(n < 10){
if(n % 2 == 0) return n;
return 0;
}
else{
if(n % 10 % 2 == 0) return n % 10 + tongchan(n / 10);
else return tongchan(n / 10);
}
}
Cho số nguyên không âm N, hãy kiểm tra xem tất cả các chữ số của N có phải đều là số chẵn hay
không?:
#include <stdio.h>
#include <math.h>
#define ll long long
int check(ll n){
if(n < 10){
if(n % 2 == 0) return 1;
return 0;
}
else{
if(n % 10 % 2 == 1) return 0;
else return check(n / 10);
}
}