Nhờ mọi người sửa code chạy sai kết quả

ĐỀ BÀI :
Mỗi lần bị kẹt trên đường vì tắc đường, An thường nghĩ ra trò chơi để giải trí. Một trong những trò chơi đó là An đọc N số từ các biển số xe và tìm số nguyên M (M>1) sao cho N số đã đọc đều có cùng số dư khi chia cho M. An muốn tìm được càng nhiều số M như thế càng tốt. Bạn hãy giúp An tìm tất cả các số M thoả mãn yêu cầu.

Dữ liệu: Vào từ file GAME.INP

Dòng đầu tiên chứa số nguyên N (2 < N <100). N dòng tiếp theo, dòng thứ i chứa số nguyên Bi thuộc đoạn [1; 109]. Tất cả các số nguyên đôi một khác nhau. Dữ liệu vào luôn đảm bảo tồn tại ít nhất một số M thoả mãn yêu cầu.

Kết quả: Ghi ra file GAME.OUT tất cả các số M tìm được theo thứ tự tăng dần, các số ghi cách nhau ít nhất một dấu cách.
mn giúp em với em newbie :frowning:

code:

#include <bits/stdc++.h>

using namespace std;
bool kiemtra (long int a[], int n, int k)
 {

    int mod = a[0] % k;
     for (int i=1;i<n;i++)
     {
         if (a[i]%k != mod);
         {
             break;
             return false;
         }
     }
     return true ;
 }
int main()
{
  long int a[10001],b[10001];
  int n,m =0;
   ifstream fi;
   fi.open("GAME.INP");
   fi >> n;
   for (int i=0;i<n;i++) fi >> a[i];
   sort(a,a+n);
   int k =2;
   while (k < a[0])
   {
       if (kiemtra(a,n,k)==true) {
        b[m] = k;
        m++;
       }
         k++;
   }
   ofstream fo("GAME.OUT");
   for (int i=0;i<m;i++)
   {
       fo << b[i] << endl;
   }
   fo.close();
   fi.close();
    return 0;
}
bool kiemtra (long int a[], int n, int k)
 {

    int mod = a[0] % k;
     for (int i=1;i<n;i++)
     {
         if (a[i]%k != mod);
         {
             break;
             return false;
         }
     }
     return true ;
 }

Sao trong for lại lòi đâu ra thằng break nhỉ. :v

3 Likes

thì chỉ cần một phần tử a[i] % k khác với a[o]%k ban đầu luôn thì return false mà nhỉ

Nhưng bạn break rồi thì nó đâu có chạy xuống return false nữa. :kissing:

2 Likes

bỏ đi thì cũng thế à :frowning:

Thừa ; sau if kìa. :v :v

Với lại k phải bắt đầu từ 1 chứ nhỉ.

2 Likes

Hi Phạm Nam.
Theo ý kiến cá nhân mình. Nếu bạn làm bài tập thì có thể lên các nhóm sinh viên và thuê chắc sẽ có mình chưa thử (cái gì không mua được bằng tiền thì mua được bằng rất nhiều tiền). Còn nếu bạn học nghiêm túc thì việc tìm lỗi, sửa lỗi là một kỹ năng, nó đôi khi còn quan trọng hơn giải thuật nữa. Hãy bắt đầu bằng một số điểm chính sau:

  1. Hiểu ngôn ngữ. Đa phần các lỗi biên dịch đều do người lập trình không nắm rõ được ngôn ngữ, thư viện. Một số các lỗi khi chạy cũng do nó VD: if( check = 1) hay break trong switch nhưng chủ yếu nó ảnh hưởng đến luồng chương trình hoặc chết luôn khi chạy nên nếu đọc kỹ lý thuyết (tập lệnh ngôn ngữ không nhiều lắm) sẽ ít bị hơn.
  2. Hiểu thuật toán. Đây là phân khó vì khác với ngôn ngữ chỉ có giới hạn mà thuật toán vô hạn. Bạn cần hiểu nó, chia nó ra thành từng phần một: Đọc dữ liệu, ghi dữ liệu, kiểm tra một phần tử, lặp các phần tử kiểm tra. Hãy in ra ở chỗ nào khả nghi hoặc dùng công cụ debug để theo dõi luồng chương trình cũng như giá trị biến trong từng bước.
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?