30/09/2018, 17:05

[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("
%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("
%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

... viết 19:17 ngày 30/09/2018
#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);
            }
   
}
Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

Minh Hoàng viết 19:18 ngày 30/09/2018

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

Thành Phạm viết 19:18 ngày 30/09/2018

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

http://cdn.daynhauhoc.com//daynhauhoc.s3-ap-southeast-1.amazonaws.com/original/2X/2/2d6f46faef00cd8f99b7ce36f6cad00d5bfac150.png

Làm giàu, làm giàu, làm giàu..... viết 19:13 ngày 30/09/2018

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

... viết 19:18 ngày 30/09/2018

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

if((pow(a,3)+pow(b,3)+pow(c,3))==(100*a+10*b+c))
Thành Phạm viết 19:19 ngày 30/09/2018

Vẫn vậy ạ

Gió viết 19:06 ngày 30/09/2018

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
Thành Phạm viết 19:05 ngày 30/09/2018

Yesssssssssss. Hahahahh. Cuối cùng cũng hiểu, tks anh @Gio nhá
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

Nên sử dụng powf nếu biến là int, còn khi sử dụng pow thì kết quả sẽ ra như @david15894 trình bày.


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

Bài liên quan
0