Lỗi về lời gọi hàm

Em đang làm bài cho 1 mảng gồm n số, trong đó:
h(x) là tích các số trong mảng
g(x) là ucln các số trong mảng
Tìm h(x) ^ g(x)

Đoạn code bên dưới của em hoàn thành xong thuật toán nhưng khi chạy nó không return về 0. Em kiểm tra thì thấy ở đoạn uc = gcd(uc, a[i]) nếu em gọi hàm theo kiểu gán vào 1 biến thế này thì sẽ sai.
Em phải làm thế nào ạ? Mong mọi người giúp đỡ

#include<bits/stdc++.h>
#define mod 1000000007

using namespace std;

int	gcd(int a, int b){
	while(a != b){
		if(a>b) a = a % b;
		else 	b = b % a;
	}
	return a;
}

int solve(int n, int a[]){
	//find h(x)
	int mul = 1;
	for(int i=0;i<n;++i)	mul = mul*a[i];
	
	//find g(x)
	int uc = gcd(a[0], a[1]);
	for(int i=2;i<n;++i){
		uc = gcd(uc, a[i]);
	}
	
	//find result
	int res = 1;
	while(uc != 0){
		res = mul * res % mod;
		uc--;
	}
	return res;
}

int main(){
	int T, n;
	cin >> T;
	while(T--){
		cin >> n;
		int a[n];
		for(int i=0;i<n;++i)	cin >> a[i];
		cout << solve(n, a) << endl;
	}
	
	
	
	return 0;
}
2 Likes

Bạn check lại hàm này, coi kỹ có trường hợp chia 0 hay không.

int	gcd(int a, int b){
	while(a != b){
		if(a>b) a = a % b;
		else 	b = b % a;
	}
	return a;
}

Chỗ hàm này thì khai báo như vầy là sai:

cin >> n;
int a[n];
3 Likes

Em chuyển khai báo mảng a[n] vào trong hàm solve rồi ạ. còn trường hợp chia 0 em không nhập vào để ktra. Em mới kiểm tra mảng a[2] = {2, 4} thôi ạ mà vẫn ko đc :disappointed_relieved:

a[2] = {2, 4}

gcd(int a, int b){
	while(a != b){ // 2 != 4
		if(a>b) a = a % b; 
		else 	b = b % a; // b = 4 % 2 = 0 --> a = 2, b = 0  --> a != b
                                   // --> Quay lại vòng while 1 lần nữa thì thế nào ?
	}
	return a;

Em chuyển khai báo mảng a[n] vào trong hàm solve rồi ạ.

Vấn đề ở đây là khai báo mảng với số lượng phần tử không phải là hằng số là điều không hợp lệ. Nếu muốn số lượng thay đổi theo biến thì phải sử dụng cấp phát động new

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