Chương trình kiểm tra lũy thừa bậc 2 bị tràn bộ nhớ

mn ai có lòng giúp em câu này với


e có đề bài như trên hình thì e có làm như sao

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int kiemTraLuyThua (int input){
	int counter = 1;
	while (input>2){
		if (input % 2 == 0){
			input = input / 2;
			counter ++;
		}
		else{
			counter = 0;
			break;
		}
	}
	return counter;
}

int main(){
	int input, output;
	printf("Nhap 1 so nguyen duong: ");
	scanf("%d",input);
	output = input;
	
	while (input > 1){
		
		if (kiemTraLuyThua (input) == 0){
			printf("So %d khong phai la mot luy thua cua co so 2.",output);
		}
		else{
			printf("So %d la ket qua cua 2 mu %d.",output, kiemTraLuyThua);
		}
	}
	printf("Ket thuc");
	
}

thì khi e chạy code này e ko hiểu tại sao chương trình bị tràn bộ nhớ ko chạy đc .
e còn mới học code c nên vẫn còn non mong các cao nhân chỉ giáo

Vì bạn không dừng lại cho người ta nhập :smiley:

Do input không đổi nên vòng lặp chạy mãi không dừng. Để kiểm tra dữ liệu vào thì vòng lặp phải bao quanh lệnh nhập.

4 Likes

Bạn xem lại cú pháp scanf.

2 Likes

image

Mình nghĩ bài này dùng phép tính Logarit là được rồi nhỉ.

6 Likes

e cũng nghĩ vậy n mà e đang muốn tập một hướng giải khác
cảm ơn bác vì đã góp ý

Bài này dùng bit trick chứ :smiley: Tính log thì nó lại không chính xác (và lâu vì gọi log).

5 Likes

Mình có thử dùng logarit như ở dưới, tạm thời thì thấy kết quả vẫn đúng, không biết có corner case nào không.

#include <iostream>
#include <math.h>
using namespace std;

int FindX(double base, double n)
{
    double temp = (log(n) / log(base));
    return temp == (int)temp ? temp : -1;
}

int main() 
{
	cout << FindX(2, 4) << endl;
	cout << FindX(2, 7) << endl;
	cout << FindX(2, 16) << endl;
	cout << FindX(2, 17) << endl;
	
	return 0;
}

Tuy nhiên, do bài này đặt biệt có cơ số 2, nên áp dụng bit operator cũng hợp lý :grin:

2 Likes

Đúng thế rồi.
@Quang_Pham8 bạn nên tìm hiểu tí về các phép toán bit.
Nếu chỉ có duy nhất 1 bit 1 (không phải bit dấu) số đó là lũy thừa của cơ số 2.

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