(Sau khi một số chỉnh sửa mở rộng :)
Nếu bạn chỉ có 2 cử tri, sau đó bạn chỉ có thể tạo ra các tỷ lệ phần trăm sau cho thí sinh A và B:
0+100, 100+0, or 50+50
Nếu bạn có 3 cử tri, sau đó bạn có
0+100, 100+0, 33.33+66.67, 66.67+33.33 [notice the rounding]
Vì vậy, đây là một vấn đề thú vị về phân số.
Nếu bạn có thể kiếm được 25% thì bạn phải có ít nhất 4 người (vì vậy bạn có thể làm 1/4, vì 1/2 và 1/3 sẽ không cắt nó). Bạn có thể làm điều đó với nhiều hơn (tức là 2/8 = 25%) nhưng vấn đề yêu cầu ít nhất.
Tuy nhiên, phần thú vị hơn yêu cầu số lượng nhiều hơn 1 trong tử số:
2/5 = 40%
Vì bạn không thể có được điều đó với bất cứ điều gì nhưng 2 hoặc nhiều hơn trong tử số (1/x sẽ không bao giờ cắt nó).
Bạn có thể so sánh ở mỗi bước và tăng tử số hoặc mẫu số, hiệu quả hơn nhiều so với lặp qua toàn bộ không gian mẫu cho j và sau đó tăng i;
tức là nếu bạn có tỷ lệ phần trăm 3%, hãy kiểm tra tất cả các giải pháp theo cách thức lên 96/99, 97/99, 98/99 trước khi lên tới x/100 là phí thời gian. Thay vào đó, bạn có thể tăng tử số hoặc mẫu số dựa trên khả năng đoán hiện tại của bạn đang làm (lớn hơn hoặc ít hơn) như vậy
int max = 5000; //we only need to go half-way at most.
public int minVoters (double onePercentage) {
double checkPercentage = onePercentage;
if (onePercentage > 50.0)
checkPercentage = 100-onePercentage; //get the smaller percentage value
double i=1;
double j=1; //arguments of Math.round must be double or float
double temp = 0;
while (j<max || i<max-1) { //we can go all the way to 4999/5000 for the lesser value
temp = (i/j)*100;
temp = Math.round(temp);
temp = temp/100;
if (temp == checkPercentage)
return j;
else if (temp > checkPercentage) //we passed up our value and need to increase the denominator
j++;
else if (temp < checkPercentage) //we are too low and increase the numerator
i++;
}
return 0; //no such solution
}
Step-khôn ngoan ví dụ cho việc tìm kiếm mẫu số đó có thể mang lại 55%
55/100 = 11/20
100-55 = 45 = 9/20 (checkPercentage will be 45.0)
1/1 100.0%
1/2 50.00%
1/3 33.33%
2/3 66.67%
2/4 50.00%
2/5 40.00%
3/5 60.00%
3/6 50.00%
3/7 42.86% (too low, increase numerator)
4/7 57.14% (too high, increase denominator)
4/8 50.00%
4/9 44.44%
5/9 55.56%
5/10 50.00%
5/11 45.45%
6/11 54.54%
6/12 50.00%
6/13 46.15%
6/14 42.86%
7/14 50.00%
7/15 46.67%
7/16 43.75%
8/16 50.00%
8/17 47.06%
8/19 42.11%
9/19 47.37%
9/20 45.00% <-bingo
những điều tốt đẹp về phương pháp này là nó sẽ chỉ mất (i + j) bước nơi i là tử số và j là mẫu số.
Ví dụ thứ ba không chính xác. '0,5323 * 1138 = 605.7574'. Một phần của một người sẽ phải bỏ phiếu. '605/1138 = 53,16%' trong khi '606/1138 = 53,25%'. Tôi không thể tưởng tượng một cách để sản xuất tỷ lệ 53,23% từ 1138 người. Đó là bước đột phá ở đây: bạn không thể tìm ra cách họ tạo ra câu trả lời bởi vì nó là _wrong_. – doppelgreener
124 là câu trả lời đúng cho ví dụ cuối cùng (xem câu trả lời dưới đây) –