01/10/2018, 14:57

Kiểm tra hộ e code liệt kê các số armstrong với

Đề bài: Viết chương trình C cho phép nhập vào n và thực hiện liệt kê các số arstrong nhỏ hơn n. (Mỗi kết quả thỏa mãn cách nhau một khoảng trắng)
INPUT
1000
OUTPUT
1 2 3 4 5 6 7 8 9 153 370 371 407
e chạy thử thấy kết quả ra đúng mà nộp lên tool của thầy giáo toàn chấm sai.

#include <stdio.h>
#include <math.h>
#define MAX 10000

int kTraArmstrong(int n){
	int k=0,a[MAX]={},m;
	m=n;
	while (m!=0){
		a[k]=m%10;
		k++;
		m/=10;
	}
	for (int i=0; i<=k; i++){
		m=m+pow(a[i],k);
	}
	
	if (n==m)
		return 1;
	else return 0;
}

void lietKeArmstrong(int x){
	int a[MAX];
	x++;
	for (int j=1;j<x; j++){
		if (kTraArmstrong(j))
			a[j]=1;
		else a[j]=0;
	}
	for (int j=1; j<x;j++){
		if (a[j])
			printf ("%d ", j);
	}
}

int main(){
	int x;
	scanf("%d", &x);
	lietKeArmstrong(x);
	return 0;
}
Đoàn Trọng Hiếu viết 17:13 ngày 01/10/2018

e chạy thử thấy kết quả ra đúng mà nộp lên tool của thầy giáo toàn chấm sai

Bác có thể nói rõ chấm sai là sai như nào không ?

rogp10 viết 17:08 ngày 01/10/2018

m=m+pow(a[i],k);

Xài pow hên xui lắm. Bài này tính toán số nguyên thì dùng phép nhân số nguyên thôi, bữa có người dính số 75 rồi (gcc không nhận, tính ra 74).
Ngoài ra còn có thể bắt khỏang trắng cuối cùng sửa lại câu pow đã.

Giờ để biết máy nào đúng: float x = 5.0, y = 7.0; assert(pow(x, 2.0) + pow(y, 2.0) == 74UL);. Assert sẽ kick ngay khi điều kiện không thỏa “Assert … failed”.

Bài liên quan
0