cuốn sách gpt4 ai đã làm

Tính toán một trong các phân đoạn (nhị phân)

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 03:29:09 26 4
mua khóa gpt4 Nike

Hiện tại tôi đang giải quyết một vấn đề như sau:

Có hai số x1 và x2 và x2 > x1.

Ví dụ x1 = 5; x2 = 10;

Và tôi phải tìm tổng giữa x1 và x2 dưới dạng biểu diễn nhị phân.

5 = 101 => 2 cái
6 = 110 => 2 cái
7 = 111 => 3 cái
8 = 1000 => 1 một
9 = 1001 => 2 cái
10= 1010 => 2 cái
vậy tổng sẽ là
tổng = 2 + 2 + 3 + 1 + 2 + 2 = 12 đơn vị;

Vì vậy, tôi đã cố gắng viết một đoạn mã thậm chí không chuyển đổi các số thành nhị phân và lãng phí thời gian thực thi.

Tôi để ý mỗi 2^nn >= 1 Số lượng là 1Ví dụ:2^1 => số 12^2 => 1 2^15 => 1

Bạn có thể kiểm tra nó ở đây nếu cần:https://www.rapidtables.com/convert/number/decimal-to-binary.html?x=191

trong mọi 2^n và 2^(n+1) Có những số liên tiếp ở giữa, bạn sẽ thấy trong ví dụ này:

      num số cái
2^4 = 16 1
17 2
18 2
19 3
20 2
21 3
22 3
23 4
24 2
25 3
26 3
27 4
28 3
29 4
30 4
31 5
2^5 = 32 1

Vì vậy tôi đã viết một đoạn mã để tìm2^n và 2^(n+1)Có bao nhiêu cái ở giữa

int t; //// lượt
int bin = 1; //// số đơn vị ở định dạng nhị phân ,, và 1 cho 2^5
int n1 = 32; //// 2^5 đây chỉ là để làm rõ
int n2 = 64; //// 2^6
int *keep = malloc(sizeof(int) * (n2 - n1); ///cái này là để giữ số vì
/// tôi sẽ cần nó sau này trong những con số liên tiếp của tôi
int i = 0;
int a = 0;
n1 = 33 //// Tôi sẽ bắt đầu từ 33 vì "bin" của 32 là "1";

while (n1 < n2) /// hãy thử tự hiểu nó ngay bây giờ
{
t = 0;
trong khi (t <= 3)
{

nếu (t == 0 || t == 2)
thùng = thùng + 1;

khác nếu (t == 1)
thùng = thùng;

khác nếu (t == 3)
{
bin = giữ [i];
i++;
}
giữ [a] = thùng;
a++;
t++;
}
n1++;
}

Dù sao, như bạn có thể thấy, tôi gần giải quyết được vấn đề, nhưng họ cho tôi những con số khổng lồ và tôi phải tìm số giữa chúng, tiếc là tôi đã thử rất nhiều cách để tính nó bằng đoạn mã trên" tổng ", nhưng cuối cùng tôi đã giải quyết được vấn đề thực thi thời gian.
Ví dụ:1, số 1000000000 là >>> 14846928141

Vì vậy, bạn có thể cho tôi một số lời khuyên về những việc cần làm tiếp theo không, cảm ơn trước.

Tôi đã làm điều này cho thử thách CodeWar:https://www.codewars.com/kata/596d34df24a04ee1e3000a25/train/c

câu trả lời hay nhất

Bạn có thể tính toán 1 đến n số chữ số trong phạm vi và sử dụng phép trừ đơn giản cho bất kỳ phạm vi con nào:

#include 
#include

/* tính số bit được đặt trong tất cả các số từ 0 đến n bị loại trừ */
bitpop dài không dấu (dài dài không dấu n) {
số lượng dài không dấu = 0, p = 1;
trong khi (p < n) {
p += p;
/* một nửa số trong các lát hoàn chỉnh của giá trị p có tập bit thứ n */
đếm += n/p * p/2;
nếu (n % p >= p / 2) {
/* tất cả các số trên p / 2 trong phần cuối cùng đều có nó */
đếm += n % p - p / 2;
}
}
số lần trả lại;
}

int main(int argc, char *argv[]) {
dài không dấu từ = 1000, đến = 2000;

nếu (argc > 1) {
đến = từ = strtoull(argv[1], NULL, 0);
nếu (argc > 2) {
to = strtoull(argv[1], NULL, 0);
}
}

printf("bitpop from %llu to %llu: %llu\n", from, to, bitpop(to + 1) - bitpop(from));
return 0;
}

Về việc tính toán một trong các phân đoạn (nhị phân), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/53403775/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress