Lỗi logic tìm số tự mãn có 2 chữ số

đề là tìm những số tự mãn có 2 chữ số -> n. VD: 153 là STM vì 153 có 3 chữ số và 153=1^3+5^3+3^3.
370 cx y chang.

#include <iostream>
using namespace std;
int dem(int a) {
    int s = 0;
    while (a != 0) {
        a = a / 10;
        s++;
    };
 return s;
}
int kt(int a) {
    int b, y, x, s = 0;
    b = a;
    y = dem(b);
    while (a != 0) {
        x = a % 10;
        a = a / 10;
        s = pow(x, y) + s;
    };
    if (s == b) {
        return 1;
    };
};
int main()
{
    int n;
    cin >> n;
    for (int i = 10; i < n; i++) {
        if (kt(i) == 1) {
            cout << i << " la so tu man." << endl;
        };
    };
    return 0;
}

Vấn đề là nếu nhập n=100000, thì nó cx in ra 10, 100, 1000,100000 và những STM khác. Sai ở đâu???

1 Like

Lỗi sai ở hàm này. Anh thử tìm kĩ lại xem. Đặc biệt ở giá trị return.
Gợi ý cho anh 1 chút là thử in giá trị trả về sau mỗi lần thực thi hàm ra xem sao.

P/s : Anh chú ý sử dụng markdown để đăng code. Chi tiết tại Cách post Code dùng Markdown trong Category Programming

2 Likes

Cái đề đúng ra nên post ngay đầu bài rồi mới tới code :slight_smile:

3 Likes

bạn cho mình hỏi sự khác nhau giữa return 0 vs return 1. Mình có kiến thức căn bản dừng lại ở Pascal (Xưa đi thi đạt giải cao lắm đó :relieved: :relieved:) giờ qua c++ học cứ tg nó cx na ná Pascal nên cứ code bthg thui.
P/s: tui ms lớp 11, nên đừng gọi anh kỳ lắm.

return 1 trả về giá trị 1 và return 0 trả về giá trị 0. Cái này thì có lẽ là bạn biết rồi nên mình chỉ giải thích cho vui thôi.

Có lẽ là bạn nghĩ sai ở đây đúng không ạ.
Do bạn có check kt(i) == 1 và hàm trả về kiểu int nên chỗ này return 0 hay return 1 không quan trọng

Bạn đã thử kiểm tra như mình bảo chưa ạ.

2004 chào 2004 :raised_hand:.

1 Like

1 (khác 0) là true còn 0 là false :smiley:

4 Likes

thực ra thì mình chỉ thay 1 thành 0 thui. bởi vì cx thử in từ trc khi hỏi bạn r cơ, lúc nãy tui thử thay return 1(nó in ra STM cùng vs 10,1000,100) thành return 0 thì nó ms ko in ra 10,1000,100 gì đó. Chứ tui chịu, bạn chỉ thẳng lỗi luôn dc ko

if (s == b) {
     return 1;
};

Giá trị bạn return trong lệnh này thực ra không quan trọng. Bạn hoàn toàn có thể để 1 ở đó hoặc đổi thành 0. Tuy nhiên return <giá trị bạn thích> ở đây chỉ return khi thỏa mãn điều kiện. Nếu không thỏa mã điều kiện mà tự thoát hàm bạn có chắc được giá trị nó trả về là gì không? Bạn có thể thử bằng cách in ra là biết.
Cách giải quyết thì thêm return 0 vào cuối hàm như này và vẫn check kt(i) == 1:

if (s == b) {
     return 1;
};
return 0;

Thực ra thì không chỉ giá trị là 10. Nếu bạn thay giá trị i = 10 ở vòng for thành 1 giá trị khác thì giá trị đó trong hầu hết các cases sẽ hiện là số tự mãn.

5 Likes

thanks :yum: :yum: :yum: :yum: :yum:

1 Like

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

Thật ra vấn đề là nằm ở chỗ đặt tên hàm, ngay việc tên hàm mà không có ý nghĩa gì thì khác nào hàm đó vô dụng. :smiley:

Sửa int dem(int a) thành [unsigned] int so_chu_so(int a), int kt(int a) thành bool la_so_tu_man(int a) rồi return 0, 1 thành true, false

Lúc viết thì tự khắc phải biết nên return true, return false trong trường hợp nào.
Còn lúc sử dụng thì cũng chỉ cần gọi if (la_so_tu_man(a)) thì cũng đủ hiểu đoạn lệnh đó nó làm cái gì. :slight_smile:

5 Likes

Vậy bần đạo cũng lại mạo muộn xin hỏi đạo hữu ktra là ktra cái gì. :slight_smile:
Kiểm tra số đó là số tự mãn? Kiểm tra số đó không là số tự mãn? Vậy thì sẽ return cái gì khi đúng và khi sai? :smiley:

Rồi đếm cũng là đếm cái gì? Đếm số ước, đếm số chẵn nhỏ hơn a? Đếm có bao nhiêu số Catalan nhỏ hơn a? :smiley:


Vậy bần đạo cũng xin đáp lễ với đạo hữu đây một câu. :smiley:

Thiên lý chi hành, thủy vu túc hạ


Đạo hữu cao thâm, code pháp khôn lường bần đạo cũng chỉ nói đến nhiêu đó thôi, có chút tài mọn chứ nào dám bêu xấu, nêu danh thành tích như vị đạo hữu đây. :slight_smile:

9 Likes

kt là viết tắt của ktra, dem ko cần nói nó là hàm đếm. Tui thừa bt cách đặt tên ko cần phải nhắc( dăm ba cái bài STM ai thèm làm chi cho dài dòng, đặt tên ngắn thôi.)

đếm là đếm cái gì, kiểm tra là kiểm tra gì ?
chả nhẽ mình viết hàm như này rồi đặt tên là kt nhé

bool kt(int a, int i, bool b) {
    return ((a >> i) & 1) ^ !b == 0;
}

với 1 người đã đạt giải 3 cấp tỉnh như sư huynh đây thì chắc là sư huynh đây biết hàm đó là kiểm tra gì mà đúng không :angel:

Nói ko phải khoe chứ xưa dc giải 3 tỉnh, còn đứng bao thứ bao nhiêu thì ko bt :innocent: :innocent: :innocent:

thấy bạn cũng tự mãn lắm ra, cái đề này nó hợp với bạn lắm đấy :angel: :angel::angel::angel:
mình được huy chương bạc Olympic 30/4 còn chưa dám xưng danh giang hồ, còn phải rèn dũa kĩ năng, mà bạn làm thế là bạn lại hơn mình rồi :angel: bái phục bái phục

Nhân tiện mình xin tặng bạn câu này:

Never measure the height of a mountain, until you have reached the top. Then you will see how low it was.

6 Likes

A post was merged into an existing topic: Topic lưu trữ các post off-topic - version 3

Mấy huynh ạ, đệ ko bt, đệ lỡ lời chỉ có ý đùa cợt ai dè mấy huynh nghiêm túc quá, chứ đệ đây cx đi thi nên cx bt chút đỉnh về cái trình độ code của bản thân, vẫn chưa bơi ra biển lớn dc. Cái hàm kt() vì chỉ yêu cầu tìm số tự mãn, đệ chỉ ghi trong ctrinh đó thôi, chứ đệ cx bt là đặt tên phải thể hiện chức năng. Lý do đệ đùa mấy huynh là đệ thấymắc cười quá: chỉ là một ctrinh để thực nghiệm thui, mà vị huynh đài đây làm quá.

Cuối lời, chân thành xin lỗi đến vị huynh đài trên kia.:scream::scream::scream:.đệ sẽ coi đây là kinh nghiệm để nghiêm túc hơn vs lời nói của mình. Mà vị huynh đài đạt olympic thì em chân thành xin lỗi, cx tự thấy thành tíc của mình trong trg ít ai có nên là cx hơi vui quá chớn chứ e bt cái trình của m thì chỉ hack like fb thôi :hotsprings::hotsprings::hotsprings::hotsprings:.mong huynh hạ hoả. Mà chuyên e đậu vào năm lớp 8giờ 11 r ms quay lại nên cao tay hứng, cái máu hacker nó lại nóng trong ng ấy mà.CHÂN THÀNH XIN LỖI

3 Likes

Thôi được rồi, vấn đề được giải quyết thì bạn đánh dấu :ballot_box_with_check: (giải pháp - solution) cho câu bạn ưng ý.
Mình cũng hiểu ý của bạn, đây là bài tập đơn, nội dung chỉ có 1 nên du di đặt tên tắt.

6 Likes

A post was merged into an existing topic: Duplicate posts will be moved here

thôi giúp thì giúp đến cùng, thấy bạn bị assert dominance tội quá
mình đã đọc sơ qua code của bạn thì cũng có vài cái để nói

  • nếu bạn đã thi qua các cuộc thi lập trình thì hiển nhiên bạn phải học về chuỗi rồi (có khi chưa) , thì bạn có thể tối giản cái đếm chữ số: chuyển nó về chuỗi rồi lấy chiều dài của nó, tiện vài vòng for, còn làm như nào thì google không tính phí. có khi lại giúp bạn được mấy case số cực lớn :stuck_out_tongue:
  • bạn chưa trả về giá trị khi s != b, và từ đó nó báo lỗi :))) còn cách fix xem tại đây, có gì mark solution cho bạn đấy luôn :)))

Kính chúc sư huynh thành công trên con đường lập trình :slight_smile:

6 Likes

tuổi trẻ chưa trải sự đời, lâu r ko đụng tới chứ tui bt là nên ép kiểu r lồi strlen() cho lẹ nhưng mà tui làm quen ấy vs c++ dc mấy hôm nên phải test, huynh đài đây nói chưa học chuỗi trong lòng có chút hơi tự ái, cho hỏi “Khẳng định sự thống trị”, vì trình TA có hạn nên phải sài gg dịch, cx ko hiểu ý lắm, rốt cục là vị huynh đài đây có để bụng ko

1 Like

vậy thì xin giới thiệu sư huynh đây vài bí thuật: trong C++ có 1 hàm gọi là to_string() có thể ép kiểu giùm sư huynh và hàm length() có thể lấy chiều dài chuỗi, điều sư huynh cần nhớ chính là phải #include <string> mà thôi

và đây là ví dụ

int number = 69420; 
string number_but_in_string = to_string(number);
int length = number_but_in_string.length();
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?