Bài toán chuỗi số

Cô giáo dạy học

Bài toán chuỗi số

Cho một chuỗi số có quy luật. Bạn có thể tìm được hai số cuối của dãy không, thay thế chúng trong dấu hỏi chấm (?). Bài toán không dễ dàng lắm đâu, vì chúng được tạo ra bởi một quy luật rất phức tạp. Bạn thử sức xem?

5 8 11 14 17 23 27 32 35 41 49 52 ? ?

Thuật toán

Để giải bài toán này, ta cần tìm quy luật của chuỗi số trước.

Ta có thể nhận thấy rằng các số trong chuỗi này tăng dần và có sự chênh lệch giữa các số liên tiếp không đều. Để đơn giản hóa bài toán, ta có thể tính khoảng cách giữa các số trong chuỗi này, kết quả thu được là:

3 3 3 3 6 4 5 3 6 8 3

Ta thấy được rằng khoảng cách giữa các số này là 3 hoặc 6, trừ 2 khoảng cách cuối cùng lần lượt là 8 và 3. Vậy quy luật của chuỗi này là cộng vào số trước đó một khoảng cách có giá trị là 3 hoặc 6.

Dựa trên quy luật này, ta có thể tính tiếp các số tiếp theo của chuỗi này:

5 8 11 14 17 23 27 32 35 41 49 52 55 58

Vậy hai số cuối cùng của dãy số là 55 và 58.

Cài đặt bài toán với Python

def tim_hai_so_cuoi_chuoi_so(chuoi_so):
    # Tính khoảng cách giữa các số trong chuỗi
    khoang_cach = []
    for i in range(len(chuoi_so)-1):
        khoang_cach.append(int(chuoi_so[i+1]) - int(chuoi_so[i]))

    # Tìm quy luật và tính tiếp các số tiếp theo
    so_cuoi_cung = int(chuoi_so[-1])
    so_truoc_do = int(chuoi_so[-2])
    khoang_cach_cuoi_cung = int(khoang_cach[-1])
    khoang_cach_truoc_do = int(khoang_cach[-2])
    if khoang_cach_cuoi_cung == 3:
        so_tiep_theo = so_cuoi_cung + 6
    elif khoang_cach_cuoi_cung == 6:
        so_tiep_theo = so_cuoi_cung + 3
    elif khoang_cach_truoc_do == 3:
        so_tiep_theo = so_cuoi_cung + 6
    else:
        so_tiep_theo = so_cuoi_cung + 3
    
    so_tiep_theo_2 = so_tiep_theo + 3
    return [so_tiep_theo, so_tiep_theo_2]

# Nhập chuỗi số
chuoi_so = input("Nhập chuỗi số: ")

# Tìm hai số cuối cùng của chuỗi số
ket_qua = tim_hai_so_cuoi_chuoi_so(chuoi_so)

# In kết quả
print("Hai số cuối cùng của chuỗi số là:", ket_qua[0], "và", ket_qua[1])

Cài đặt bài toán với C++

#include <iostream>
#include <string>
using namespace std;

void timHaiSoCuoiChuoiSo(string chuoiSo) {
    // Tính khoảng cách giữa các số trong chuỗi
    int khoangCach[chuoiSo.length()-1];
    for (int i = 0; i < chuoiSo.length()-1; i++) {
        khoangCach[i] = chuoiSo[i+1] - chuoiSo[i];
    }

    // Tìm quy luật và tính tiếp các số tiếp theo
    int soCuoiCung = chuoiSo[chuoiSo.length()-1] - '0';
    int soTruocDo = chuoiSo[chuoiSo.length()-2] - '0';
    int khoangCachCuoiCung = khoangCach[chuoiSo.length()-2];
    int khoangCachTruocDo = khoangCach[chuoiSo.length()-3];
    int soTiepTheo;
    if (khoangCachCuoiCung == 3) {
        soTiepTheo = soCuoiCung + 6;
    }
    else if (khoangCachCuoiCung == 6) {
        soTiepTheo = soCuoiCung + 3;
    }
    else if (khoangCachTruocDo == 3) {
        soTiepTheo = soCuoiCung + 6;
    }
    else {
        soTiepTheo = soCuoiCung + 3;
    }

    int soTiepTheo2 = soTiepTheo + 3;

    // In kết quả
    cout << "Hai số cuối cùng của chuỗi số là: " << soTiepTheo << " và " << soTiepTheo2 << endl;
}

int main() {
    // Nhập chuỗi số
    string chuoiSo;
    cout << "Nhập chuỗi số: ";
    getline(cin, chuoiSo);

    // Tìm hai số cuối cùng của chuỗi số
    timHaiSoCuoiChuoiSo(chuoiSo);

    return 0;
}

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *