[Solved]Lỗi khi đặt nhiều phép toán pow trong điều kiện IF

Tình hình là 2 cách code này em không thấy có gì khác nhau cả mà sao một cách thiếu mất một nghiệm 407
Đây là bài tìm số có 3 chữ số sao cho số đó bằng tổng lập phương các chữ số.
Em cùng Code::Block 10.05 nhá

Cách 1: chạy ra

153
370
371
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{

    int a,b,c;
    for  (a=1;a<=9;a++)
        for(b=0;b<=9;b++)
            for(c=0;c<=9;c++)
            {
                    if(pow(a,3)+pow(b,3)+pow(c,3)==100*a+10*b+c)
                           printf("\n%d%d%d",a,b,c);
            }
   
}

Cách 2: chạy ra

153
370
371
407
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{

    int a,b,c;
    for  (a=1;a<=9;a++)
        for(b=0;b<=9;b++)
            for(c=0;c<=9;c++)
            {
                    int d=pow(a,3)+pow(b,3)+pow(c,3);
                    int e=100*a+10*b+c;
                    if(d==e)
                           printf("\n%d%d%d",a,b,c);
            }

}

Update:
Đã test cả 2 code trên trang https://ideone.com/YYNWK9 đều chạy ra đủ nghiệm, chắc phải xem lại thằng Code::Block :joy:

#include <stdio.h>
//#include <conio.h>
#include <math.h>
int main()
{

    int a,b,c;
    for  (a=1;a<=9;a++)
        for(b=0;b<=9;b++)
            for(c=0;c<=9;c++)
            {
                    if((pow(a,3)+pow(b,3)+pow(c,3))==(100*a+10*b+c))
                           printf("\n%d%d%d",a,b,c);
            }
   
}
1 Like

thấy độ ưu tiên như nhau mà nhỉ :smiley:

1 Like

Em cũng chạy trên trang đó ,cả 2 code đều ra đủ nghiệm, nhưng chạy trên máy em thì lại thiếu 1 nghiệm quái thật :joy:

đập máy đê, dối trá :stuck_out_tongue:

1 Like
if((pow(a,3)+pow(b,3)+pow(c,3))==(100*a+10*b+c))
1 Like

Vẫn vậy ạ :blush:

1 Like

Phép toán pow của bạn là dùng hàm với số thực nên sẽ có sai số:

  • Cách 1: viết lại hàm pow
#include <iostream>
using namespace std;

int pow(int a,int p){
    if(p==0) return 1;
    int t=pow(a,p/2);
    return t*t*(p&1?a:1);
}
int main() {
    
    int a,b,c;
    for(a=1;a<=9;++a){
        for(b=0;b<=9;++b){
            for(c=0;c<=9;++c){
                if(pow(a,3)+pow(b,3)+pow(c,3)==100*a+10*b+c){
                    printf("%d%d%d\n",a,b,c);
                }
            }
        }
    }
    return 0;
}
  • Cách 2: xử lí sai số:
#include <iostream>
#include <cmath>

using namespace std;


int main() {
    
    int a,b,c;
    for(a=1;a<=9;++a){
        for(b=0;b<=9;++b){
            for(c=0;c<=9;++c){
                if(abs(pow(a,3)+pow(b,3)+pow(c,3)-(100*a+10*b+c))<=1E-2){
                    printf("%d%d%d\n",a,b,c);
                }
            }
        }
    }
    return 0;
}
#kết quả
153
370
371
407
2 Likes

Yesssssssssss. Hahahahh. Cuối cùng cũng hiểu, tks anh @Gio nhá :smile:
Em phát hiện ra một cái nữa là những bài kiểu này nên dùng powf, vì các biến đều là int thì sẽ không bị sai số nữa


Có thể là khi ở các compiler khác thì có cơ chế làm tròn/đảm bảo độ chính xác nên không bị sai như code::block


Thêm một kinh nghiệm nữa là không nên dùng == hoặc là != giữa double và integer như ở trên :blush:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?