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
Đề 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
thuận nghịch thì là dạng ABCDE EDCBA, số A có 9 cách chọn 1-9, B,C,D,E có 10 cách chọn từ 0-9. Vậy tối đa chỉ cần Brute force 9*10^4 nhân với số check tổng chia hết cho 5. Phần check tổng là vòng while <5, không đáng kể.
Nói chung nếu test case là m. thì chỉ cần m*10^5 là cùng thôi fen.
 
thuận nghịch thì là dạng ABCDE EDCBA, số A có 9 cách chọn 1-9, B,C,D,E có 10 cách chọn từ 0-9. Vậy tối đa chỉ cần Brute force 9*10^4 nhân với số check tổng chia hết cho 5. Phần check tổng là vòng while <5, không đáng kể.
Nói chung nếu test case là m. thì chỉ cần m*10^5 là cùng thôi fen.

Mình đang nói là theo cách của chủ thớt (OP) thì overflow. Cách của bạn check 1 nửa thì đúng. Tuy nhiên cách giải bạn nói chưa đầy đủ.
  • Nếu n lẻ thì là tổng n/2 số đầu tiên * 2 + số chính giữa chia hết cho 10
  • Nếu n chẵn thì là tổng n/2 số đầu tiên chia hết cho 5.

Bài này dùng đệ quy stop ở n/2 số đầu tiên là được. và complexity như bạn nó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:
Code gì thế này. Mới học xong 20 code thiếu nhi à.
 
Các thím làm mở rộng đi, cho trước 1 range a -> b, tìm số chữ số trong range này có tổng bằng x.

giả sử 0 < a < b < 10^10, x < 10^2
 
Nội dung không phù hợp
1622435332367.png

C:
#include<stdio.h>
#include<math.h>
int nguyento(int n){
    if(n==1||n==0) return 1;
    for(int i=2;i<=sqrt(n);i++){
        if(n%i==0) return 1;
    }
    return 0;
}
int chiatong(int n){
    int k,sum=0;
    while(n){
        k=n%10;
        n=n/10;
        sum=sum+k;
        if(nguyento(k)==1) return 1;
    }
    if(nguyento(sum)==0)return 0;
    else return 1;
}
int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        int a,b,chick=0;
        scanf("%d%d",&a,&b);
        for(int i=a;i<=b;i++){
            if(nguyento(i)==0){
                if(chiatong(i)==0){
                    chick++;
                }
            }
        }
        printf("%d\n",chick);
    }
}




=======> code này của mình chưa tối ưu ai có cách hay hơn chỉ giúp với xin cảm ơn.
 
Sửa lần cuối bởi điều hành viên:
1. Code phải để trong thẻ, ví dụ như này
Mã:
Code
2. Trình bày sơ về phương án của bạn, có độ phức tạp là bao nhiêu

Để 1 nồi như thế ai mà đọc được.

Warn 1 point cho lần sau rút kinh nghiệm :doubt:
 
cái vụ truy vết thằng làm lộ sao kê, ai cũng hiểu là log tới tận răng mà mấy cha còn k biết thì hiểu r
IT ak CNTT vẫn còn là cái gì đó ngoài tầm của người bình thường mà fen. Người trong ngành có thể ko xa lạ gì, nhưng vì tính chất trừu tượng quá cao nên nhiều khi khó tiếp cận với công chúng
yBBewst.png
 
IT ak CNTT vẫn còn là cái gì đó ngoài tầm của người bình thường mà fen. Người trong ngành có thể ko xa lạ gì, nhưng vì tính chất trừu tượng quá cao nên nhiều khi khó tiếp cận với công chúng
yBBewst.png
giờ nổi quá, chứ xưa hình như ai mà background IT mới vô đây thui nhỉ
 

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