Giải bài toán C++ thú vị

Tình cờ biết đọc được bài toán này. Mời mọi người giải trí tí ạ :smiley:
Đề: Tính số vé xe bus + tiền dư
Khách đưa 1 số tiền, giá mỗi vé là 2000.
Tính số vé mà khách có thể mua được. Nếu số tiền dư >= 1000 thì có thể mua thêm 1 vé và dư = 0.
Ví dụ: +Khách đưa 5000 => Vé = 3, dư = 0
+Khách đưa 4500 => Vé = 2, dư =500.
+Khách đưa 3500 => Vé = 2, dư =0.
*Lưu ý: Chỉ được sử dụng các phép toán + - * / % và ép kiểu.
Nghĩa là cấm vòng lặp/goto, cấm câu điều kiện, cấm nọi biểu thức so sánh

Đây là bài làm của mình :smile:

#include <stdio.h>
int main() {
    int n=200;
    int q=n/2000;
    int r=n%2000;
    unsigned t=r-999;
    int signed_bit=t/0x80000000;/*0x80000000 = 1<<31 */// xác định r>=1000 hay không 
    //signed_bit=0 -> >=1000  or  =1 <1000
    
    q+=(1-signed_bit);
    r*=signed_bit;
    printf("%d %d\n",q,r);
    return 0;
}

4 Likes

Em chỉ làm được thế này thôi

#include <iostream>
using namespace std;

int main()
{
	int n;
	cin >> n; // Input the amount of money

	int count = (n / 2000) + ((n % 2000) / 1000);
	cout << count << endl;

	return 0;
}
3 Likes

Thú vị ở chỗ đưa ra số dư. hì :wink:

Code của Gió mình chưa lĩnh hội được. Gió có thể nói qua ý tưởng được không? :smile:

Kiểu int thì có bit đầu để lưu dấu. Vì không dc dùng so sánh nên mình cast sang unsigned thì các bit của nó vẫn giữ nguyên. Như vậy để lấy giá tri bit đầu thì chia cho 2^31 nữa :smile:

2 Likes

code của mình đơn giản ngắn gọn có thế này thôi

void ShortNComplicated(int TienKhachDua){
int GiaVe = 2000;
int HanMucKM = 1000;
int MaxVe = TienKhachDua / GiaVe + ((TienKhachDua % GiaVe) / HanMucKM);
int Du = (TienKhachDua % GiaVe) *(1 - ((TienKhachDua % GiaVe) / HanMucKM));
printf("Ve=%d, du=%d\n", MaxVe, Du);

}

2 Likes

Gọn thật. Về mặt ý tưởng thì t giống của sonOnline

1 Like

Thế thà đưa 5000 còn được 3 vé chứ đưa 6000 cũng được có 3 vé. khó chỗ này

Chỉ là giải trí thôi mà bạn :). Ngoài mà được vậy thì quý mất anh thu vé xe phải biết :slight_smile:

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