Tình cờ biết đọc được bài toán này. Mời mọi người giải trí tí ạ
Đề: 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
Giải bài toán C++ thú vị
Đây là bài làm của mình
#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ì
Code của Gió mình chưa lĩnh hội được. Gió có thể nói qua ý tưởng được không?
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
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