thắc mắc Gợi ý giúp e với :3

  • Người tạo chủ đề Người tạo chủ đề DảkVcl
  • Ngày bắt đầu Ngày bắt đầu

DảkVcl

Senior Member
e muốn hỏi cách để chạy 1 vòng lặp có n chữ chữ số
Ví dụ n=2 thì chạy từ 10 đến 99.
n=3 chạy từ 100 đến 999.
Screenshot (308).png

https://github.com/VietPTITcode/vietPTIT1005github/commit/7291cb76da6f84e487262aba2529bbe5e9deac9e
code e đây e bị TLE
 
Tính chất thuận nghịch, mình đoán ý là palindrome.
Bài này bạn dùng generating function chắc sẽ rất nhanh.
vd input=5
Mã:
(x^2+x^4+x^6+x^8+x^10+x^12+x^14+x^16+x^18)^1*(1+x^2+x^4+x^6+x^8+x^10+x^12+x^14+x^16+x^18)^1*(1+x^2+x^3+x^4+x^5+x^6+x^7+x^8+x^9)
lấy tổng các x^k với k chia hết cho 10 của khai triển trên là xong.
 
Sửa lần cuối:
C++:
#include<iostream>
#include<cmath>
using namespace std;
bool SoThuanNghich(int n){
    int tmp1 = n;
    int tmp2 = 0;
    while(tmp1 > 0){
        tmp2 = tmp2 * 10 + (tmp1 % 10);
        tmp1 = tmp1 / 10;
    }
    if(tmp2 == n) return true;
    else return false;
}
bool SoChia10(int n){
    int temp1 = n;
    int temp2 = 0;
    while(temp1 > 0){
        temp2 = temp2 + (temp1 % 10);
        temp1 = temp1 / 10;
    }
    if(temp2 % 10 == 0) return true;
    else return false;
}
int main(){
    int n = 0;
    int count = 0;
    int tmp = 1;
    while(n<=0){
        cout << "Nhap so n lon hon 0: " << endl;
        cin >> n;
    }
    int k = 1;
    while(k <= n){
        tmp = tmp * 10;
        k++;
    }
    for(int m = tmp - 1; m >= (tmp / 10); m--){
        if(SoThuanNghich(m) == true && SoChia10(m) == true){
            count++;
        }
    }
    cout << count << endl;
    system("pause");
    return 1;
}
:go::go::go:
 
Sửa lần cuối:
Thì cache trước phép tính số mũ
Biết tính độ phức tạp thuật toán ko?
cách này không được đâu, 3 giây trong C++ cùng lắm được 10^8 phép tính thôi, mà đề cho n đến 10, tìm cách khác thôi :sad:
https://www.geeksforgeeks.org/digit-dp-introduction/

https://stackoverflow.com/questions...d-b-with-a-certain-property/22394258#22394258

xem giúp đc gì ko
Bài này không cần dùng đến digit dp đâu, chỉ cần sinh là xong. Để ý vì số là palindrom nên chỉ cần sinh 1/2 số chữ số thôi
 
:go: thớt nó mới học nhập môn lập trình thì cần gì quan tâm cái đó
cái đấy ở trong các sách thuật toán đều để ở chương 1, vì lý do là trước khi thực hiện viết thuật toán là phải tính trước độ phức tạp rồi, cách nào mà chậm thì phải tránh ngay, tìm thuật toán khác
 
C++:
#include<iostream>
#include<cmath>
using namespace std;
bool SoThuanNghich(int n){
    int tmp1 = n;
    int tmp2 = 0;
    while(tmp1 > 0){
        tmp2 = tmp2 + (tmp1 % 10);
        tmp1 = tmp1 / 10;
    }
    if(tmp2 == n) return true;
    else return false;
}
bool SoChia10(int n){
    if(n % 10 == 0) return true;
    else return false;
}
int main(){
    int n;
    int count = 0;
    int tmp = 1;
    while(n<=0){
        cout << "Nhap so n lon hon 0: " << endl;
        cin >> n;
    }
    int k = 0;
    while(k <= n){
        tmp = tmp * 10;
        k++;
    }
    for(int m = tmp - 1; m >= (tmp / 10); m++){
        if(SoThuanNghich(m) == true && SoChia10(m) == true){
            count++;
        }
    }
    cout << count << endl;
    system("pause");
    return 1;
}
:go::go::go:

Đề ghi là: Tổng số chữ số chia hết cho 10. Chứ không phải chia hết cho 10. Với chia hết cho 10 thì không thuận nghịch được đâu
 
cái đấy ở trong các sách thuật toán đều để ở chương 1, vì lý do là trước khi thực hiện viết thuật toán là phải tính trước độ phức tạp rồi, cách nào mà chậm thì phải tránh ngay, tìm thuật toán khác
:go: chịu
sách nhập môn lập trình chỗ tôi làm gì có cái ấy. Lên đến cấu trúc dữ liệu mới lưu ý
 
cách này không được đâu, 3 giây trong C++ cùng lắm được 10^8 phép tính thôi, mà đề cho n đến 10, tìm cách khác thôi :sad:
https://www.geeksforgeeks.org/digit-dp-introduction/

https://stackoverflow.com/questions...d-b-with-a-certain-property/22394258#22394258

xem giúp đc gì ko
Đề cho n < 10. Nếu n = 9 thì tổng số số phải check là 9 * 10^8. Check thuận nghịch theo cách của OP thì time complexity sẽ là O(9 * 10 ^ 9) sẽ bị overflow
 
Đề này làm theo thông thường thì bị TLE là phải rồi.
n = 9 -> chạy từ 100.000.000 -> 999.999.999, mỗi số lại check palindrome lẫn vụ tổng chia hết 10 thì chắc chắn TLE.

Bài này nhập môn lập trình làm sao nổi :D
 
:doubt: sửa code lại rồi đó
lỗi tôi. Tại tôi đang test chức năng code trong forum trông xịn xò quá nên quên
 
chỉ cần sinh thôi. vì nó là palindrome và giới hạn là 2 <= n <= 9 nên chỉ cần quan tâm n / 2 chữ số đầu tiên -> sinh toàn bộ số có n / 2 chữ số, biến thành số có n chữ số và kiểm tra.

n to hơn thì dùng qhđ.
 

Thống kê chủ đề

Ngày tạo
DảkVcl,
Người trả lời cuối
Buonnguqua6,
Trả lời
32
Lượt xem
2.040
Quay lại
Lên đầu trang