Nhập vào số nguyên a1..an(n<30000, |ai|<=10000).Số ap(1<=p<=n) ......

Mã:
#include <iostream.h>
#include <conio.h>
#include <math.h>
// 2 3 5 7 9 1 3 5 7 9
void nhap(int a[], int n);
void haisogannhaunhat(int a[], int n);
int main()
{
    int a[100],n,t;
    cout<<"nhap so phan tu: ";
 cin>>n;
    nhap(a,n);
    haisogannhaunhat(a,n);
}
void nhap(int a[], int n)
{
 for(int i=0; i<n; i++)
 {
  cin >>a[i];
 }
}
void haisogannhaunhat(int a[], int n)
{
    int k=(abs)(a[0]-a[1]);
    cout<<"Nhung cap gia tri gan nhau nhat: "<<endl;
    for (int i=0; i<n; i++)
    {
     for (int j=i+1; j<n; j++)
            if ((abs)(a[i]-a[j])<k)
                k = (abs)(a[i]-a[j]);
        for(int i=0; i<n; i++)
            for(int j=i+1; j<n; j++)
                if((abs)(a[i]-a[j])==k)
               cout<<a[i]<<" va "<<a[j]<<" tai vi tri "<<i<<" va "<<j<<endl;
    }
}
nho ban xem giup code. tim hay so gan nhau nhat trong mang, co dung k ban. thks ban nhieu:rage1:
 

tengiday

Happy life
Mình nghĩ ý của bạn về "2 số gần nhau nhất" là 2 số có abs của hiệu là bé nhất. Vòng 'for' loop của bạn đã có 'i' bên ngoài sao còn vòng 'for' i bên trong. :-| Bạn quét như thế là chạy O(n^2) rồi. Nếu bạn sort lại trước rồi xét từng đôi một kề nhau sẽ nhanh hơn, O(n log n) running time.
PS: Mấy thuật toán sort và sắp xếp dữ liệu vô cùng phổ biến. Khoảng 30% thời gian CPU chạy chính là sort đấy. :)
 
Sửa lần cuối:
Mã:
#include <iostream.h>
#include <conio.h>
#include <math.h>
// 2 3 5 7 9 1 3 5 7 9
void nhap(int a[], int n);
void quicksort(int a[], int l, int r);
void swap(int &x, int &y);
void haisogannhaunhat(int a[], int n);
int main()
{
    int a[100],n,t;
    cout<<"nhap so phan tu: ";
 cin>>n;
    nhap(a,n);
    quicksort(a,0,n);
    haisogannhaunhat(a,n);
}
void nhap(int a[], int n)
{
 for(int i=0; i<n; i++)
 {
  cin >>a[i];
 }
}
void quicksort(int a[], int l, int r)
{
 int x=a[(l+r)/2];
 int i=l;
 int j=r;
 do
 {
  while(a[i]<x) i++;
  while(a[j]>x) j--;
  if(i<=j)
  swap(a[i++],a[j--]);
 }
 while (i<j);
 if(l<j) quicksort(a,l,j);
 if(j<r) quicksort(a,i,r);
}
void swap(int &x, int &y)
 {
  int t =x;
  x=y;
  y=t;
 }
void haisogannhaunhat(int a[], int n)
{
    int k=(abs)(a[0]-a[1]);
    cout<<"Nhung cap gia tri gan nhau nhat: "<<endl;  
        for(int i=0; i<n; i++)
        if((abs)(a[i]-a[i+1])==k)
               cout<<a[i]<<" va "<<a[i+1]<<" tai vi tri "<<i<<" va "<<i+1<<endl;
    
}
nho ban koi giup code no thuc hien nhung ko chi ra dung vi tri cua 2 so gan nhau nhat.
 

tengiday

Happy life
Ý tưởng của bạn tốt, tuy nhiên có 3 thứ cần lưu ý:
- Nếu sort mảng a thì vị trí của những phần tử sẽ bị thay đổi, ko còn như ban đầu. Nếu bài toán nói in ra vị trí thì bạn cần 1 mảng 'pos' lưu vị trí ban đầu của những phần tử đó. Cái này giống như bài "k số lớn nhất" mình đã làm cho bạn. Một lần nữa, khi đổi chỗ lúc sort phải đổi cả trên mảng 'pos' này.
- Tiếp theo là cách tìm những cặp số gần nhau nhất. Chúng ta không biết cặp a[0] và a[1] là cặp gần nhau nhất. Ví dụ: với 1 3 4 5 6 7 thì rõ ràng cặp đầu ko thể gần nhau nhất đc. Bạn cần duyệt mảng 2 lần. Lần 1 tìm k; lần 2 tìm cặp có abs của hiệu là k.
- Cuối cùng, một điều nhỏ cần lưu ý. Trong hàm haisogannhaunhat, bạn ko thể để 'i' chạy tới sát n, trong khi so sánh lại cần a[i + 1], như vậy sẽ bị segmentation fault.

PS: Bạn ko cần dùng abs nếu đã sort lại mảng. ;)
 

Thống kê

Chủ đề
100,667
Bài viết
467,441
Thành viên
339,833
Thành viên mới nhất
duythinh2222
Top