feat: finish writing input output

This commit is contained in:
2023-10-26 11:37:25 +08:00
parent 1e6508bca9
commit b0988e2310
3 changed files with 86 additions and 7 deletions

View File

@ -10,6 +10,13 @@
namespace sjtu {
class int2048 {
size_t buf_length = 0;
const static int kMod = 100000000, kNum = 8, kDefaultLength = 10;
const static int kMemAdditionScalar = 2, kMemDeleteScalar = 4;
int *val = nullptr;
signed char flag = +1;
int num_length = 0;
public:
int2048();
int2048(long long);

View File

@ -23,32 +23,104 @@
*/
#include "int2048.h"
#include <cstdio>
#include <cstring>
namespace sjtu {
// 构造函数
int2048::int2048() {
// 实现构造函数逻辑
buf_length = kDefaultLength;
val = new int[buf_length]();
flag = 1;
num_length = 1;
}
int2048::int2048(long long) {
int2048::int2048(long long input_value) {
// 实现构造函数逻辑
buf_length = kDefaultLength;
val = new int[buf_length]();
if (input_value < 0) {
flag = -1;
input_value = -input_value;
} else
flag = 1;
if (input_value == 0) {
num_length = 1;
return;
}
num_length = 0;
const static int kPow10[9] = {1, 10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000};
while (input_value > 0) {
val[num_length / kNum] += (input_value % 10) * kPow10[num_length % kNum];
input_value /= 10;
num_length++;
}
}
int2048::int2048(const std::string &) {
int2048::int2048(const std::string &input_value) {
// 实现构造函数逻辑
buf_length = input_value.length() / kNum * kMemAdditionScalar;
val = new int[buf_length]();
flag = 1;
num_length = 0;
if (input_value[0] == '-') {
flag = -1;
}
const static int kPow10[9] = {1, 10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000};
int read_highest_pos = (flag > 0 ? 0 : 1);
while (input_value[read_highest_pos] == '0' &&
read_highest_pos + 1 < input_value.length())
read_highest_pos++;
for (int i = input_value.length() - 1; i >= read_highest_pos; i--) {
val[num_length / kNum] +=
(input_value[i] - '0') * kPow10[num_length % kNum];
num_length++;
}
if (num_length == 1 && val[0] == 0) flag = 1;
}
int2048::int2048(const int2048 &) {
// 实现构造函数逻辑
int2048::int2048(const int2048 &input_value) {
buf_length = input_value.buf_length;
val = new int[buf_length]();
memcpy(val, input_value.val, buf_length * sizeof(int));
flag = input_value.flag;
num_length = input_value.num_length;
}
// 读入一个大整数
void int2048::read(const std::string &) {
// 实现读取逻辑
void int2048::read(const std::string &input_value) {
delete[] val;
buf_length = input_value.length() / kNum * kMemAdditionScalar;
val = new int[buf_length]();
flag = 1;
num_length = 0;
if (input_value[0] == '-') {
flag = -1;
}
const static int kPow10[9] = {1, 10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000};
int read_highest_pos = (flag > 0 ? 0 : 1);
while (input_value[read_highest_pos] == '0' &&
read_highest_pos + 1 < input_value.length())
read_highest_pos++;
for (int i = input_value.length() - 1; i >= read_highest_pos; i--) {
val[num_length / kNum] +=
(input_value[i] - '0') * kPow10[num_length % kNum];
num_length++;
}
if (num_length == 1 && val[0] == 0) flag = 1;
}
// 输出储存的大整数,无需换行
void int2048::print() {
// 实现输出逻辑
if (flag == -1) putchar('-');
const static int kPow10[9] = {1, 10, 100, 1000, 10000,
100000, 1000000, 10000000, 100000000};
for (int i = num_length - 1; i >= 0; i--)
putchar('0' + val[i / kNum] / kPow10[i % kNum] % 10);
}
// 加上一个大整数

View File

@ -82,7 +82,7 @@ int main(int argc, char *argv[]) {
while (std::getline(list_file, line)) {
listed_cases.push_back(line);
}
} else
} else if (!test_listed_cases)
throw std::runtime_error("No test cases specified");
int total_cases = 0, total_passed = 0;
for (int i = 0; i < listed_cases.size(); i++) {