Tìm lỗi cơ bản

Mã:
#include <iostream>
using namespace std;
void nhap (int a[], int &n, int &x);
void timkiemnp(int a[], int n, int x);
int main()
{
    int a[50], n, x;
    nhap(a,n,x);
    timkiemnp(a,n,x);
}
void nhap (int a[], int &n, int &x)
{
    cin>>n>>x;
    for(int i=0; i<n ; i++)
    {
        cin>>a[i];
    }
}
void timkiemnp(int a[], int n, int x)
{
    int dem=0;
    int l=0, r=n-1;
    while(l<=r)
    {
        int m=(l+r)/2;
        if (a[m]==x)
        {
            cout<<m<<" ";
            dem=dem+1;
        }
        if(a[m]>x)
            r=m-1;
        else l=m+1;
    }
    if(dem==0) cout<<"-1";
}
AI XEM CODE Này SAI CHỗ NàO Mà K RA Kết QUả K:thatbatngo:
 

tengiday

Happy life
Cho 1 sorted array, bạn đang muốn in ra vị trí những phần tử bằng với con số 'x' nào đó phải không? Đề là gì vậy?
 
in tat ca cac vi tri bang gia tri X can tin trong array. xem giup thanh oi, chi dung tim kiem nhi phan
 

tengiday

Happy life
Khi bạn tìm như thế, có thể giá trị biến mid ở ngay giữa đoạn cần tìm. Bởi vậy lúc xác định lại left, right thì chương trình sẽ bỏ qua một đoạn lớn.
 

tengiday

Happy life
Mình sẽ dùng binary search tìm vị trí đầu tiên (first occurrence) và vị trí cuối cùng (last occurrence) của 'x' trên dãy. Bạn suy nghĩ làm sao viết đc tìm vị trí bắt đầu của một số dùng binary search trước.
Độ phức tạp của thuật toán: O(log n).
 
Mã:
int timkiem(int a[], int n, int x){
	int l=0,r=n-1,m;
	do
	{
		m=(l+r)/2;
		if(x==a[m]) return m;
		else		if(x<a[m])		r=m-1;
		else		l=m+1;	}	
while(l<=r);	
return -1;
}
vay sua nhu the nao la dung ban :/
 

tengiday

Happy life
Cái này bạn suy nghĩ trước đã nhé. Mình gợi ý là: để tìm vị trí đầu tiên thì 'mid' phải thỏa mãn tính chất là:
Mã:
(a[mid] == x) VÀ (mid == 0 hoặc a[mid - 1] < x)
 
Mã:
#include <iostream>
#include <string.h>
using namespace std;
void hoanvi(char s[] , int i)
{
 int j, n = strlen(s);
 char ch;
 for(j = i ; j < n; j++)
 {
  ch = s[i];
  s[i] = s[j];
  s[j] = ch;
  if (i == (n - 2)) cout << s<<" ";
  else hoanvi(s, i + 1);
 }
}
void main()
{
 
 char s[] = "1234";
 
 hoanvi(s, 0);
 system("pause");
}
nho ban ten gi day giai thich giup minh dong
Mã:
  if (i == (n - 2)) cout << s<<" ";
voi, tai sao no ra 24 ket qua. truong hop I==n-2 chi co 4 ket qua thoi ma. hix
 

tengiday

Happy life
Số lượng permutations tối đa của tập hợp gồm n phần tử là n!. Bạn có 4 phần tử thì sẽ có 4! = 24 permutations. Mình dùng online C++ chạy thử thì hình như vẫn chưa in ra đúng, nhất là với số 4 ở đầu.
 
Top