50102. File Addition

難度:4.9/5

本題不能從尾端一次抓8個bytes來處理,需要開一個4096的array來批次處理進位問題。 另外即使一個wb的file pointer沒有任何東西,還是可以指向後面n格的距離,以此來先寫最後面的bytes。

(參見morris大神的code)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#define min(x,y) ((x)<(y)?(x):(y))

static inline void solve(FILE *in_1, FILE *in_2, FILE *out){
fseek(in_1, 0, SEEK_END); fseek(in_2, 0, SEEK_END);
int len_1 = ftell(in_1), len_2 = ftell(in_2);
if(len_1 < len_2){
FILE *temp_f = in_1; in_1 = in_2; in_2 = temp_f;
int temp_l = len_1; len_1 = len_2; len_2 = temp_l;
}
fseek(out, len_1, SEEK_SET);

int carry = 0;
uint8_t arr_1[4096];
uint8_t arr_2[4096];
while(len_1 && len_2){
int n = min(min(len_1, len_2), 4096);

fseek(in_1, -n, SEEK_CUR); fread(arr_1, sizeof(uint8_t), n, in_1); fseek(in_1, -n, SEEK_CUR);
fseek(in_2, -n, SEEK_CUR); fread(arr_2, sizeof(uint8_t), n, in_2); fseek(in_2, -n, SEEK_CUR);

for(int i = n - 1; i >= 0; i--){
uint32_t sum = (int)arr_1[i] + (int)arr_2[i] + carry;
if(sum > 255) carry = 1;
else carry = 0;
arr_1[i] = (uint8_t)sum;
}
fseek(out, -n, SEEK_CUR); fwrite(arr_1, sizeof(uint8_t), n, out); fseek(out, -n, SEEK_CUR);
len_1 -= n, len_2 -= n;
}
while(len_1){
int n = min(len_1, 4096);

fseek(in_1, -n, SEEK_CUR); fread(arr_1, sizeof(uint8_t), n, in_1); fseek(in_1, -n, SEEK_CUR);
for(int i = n - 1; i >= 0; i--){
uint32_t sum = (int)arr_1[i] + carry;
if(sum > 255) carry = 1;
else carry = 0;
arr_1[i] = (uint8_t)sum;
}
fseek(out, -n, SEEK_CUR); fwrite(arr_1, sizeof(uint8_t), n, out); fseek(out, -n, SEEK_CUR);
len_1 -= n;
}
}

int main(){
char in_1_name[64], in_2_name[64], out_name[64];
scanf("%s%s%s", in_1_name, in_2_name, out_name);
FILE *in_1 = fopen(in_1_name, "rb"), *in_2 = fopen(in_2_name, "rb");
FILE *out = fopen(out_name, "wb");
solve(in_1, in_2, out);
fclose(in_1); fclose(in_2); fclose(out);
return 0;
}


50102. File Addition
https://aaronlin1229.github.io/judgegirl_50102/
Author
Akizumi
Posted on
July 17, 2023
Licensed under