编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#20362 #1057. 汤家凤老师的1800题 Accepted 100 15 ms 336 K C++ / 2.3 K 192022214033 2024-12-13 12:45:19
显示原始代码
#include <iostream>
#include <cstring>
using namespace std;

long long a = 1, b = 1000000000, mid;
char n[30];

// 高精度乘法计算函数声明
void search();
void solve(long long x, char res[]);
void highmul(int a[], int b[], int c[], int size_a, int size_b);
void output(int a[], char res[]);
int cmp(char a[], char b[]);

int main() {
    cin >> n;
    search();  // 计算某个数字(示例)
    return 0;
}

void search() {
    long long mid = (a + b) / 2;
    while (a < b) {
        char res[30] = "\0";
        solve(mid, res);

        if (cmp(res, n) >= 0) {
            b = mid;
        } else if (cmp(res, n) < 0) {
            a = mid + 1;
        }
        mid = (a + b) / 2;
    }
    cout << b << endl;
    return;
}

void solve(long long x, char res[]) {
    long long a = x, b = x + 8;
    int s[30] = { 0 }, s1[30] = { 0 }, s2[30] = { 0 }, s3[30] = { 0 };  // 增加数组大小

    int i = 0, j = 0;
    while (a != 0) {
        s[i++] = a % 10;  // 将 a 分解为每一位
        a = a / 10;
    }

    while (b != 0) {
        s1[j++] = b % 10;  // 将 b 分解为每一位
        b = b / 10;
    }

    // 计算 s * s 和 s * s1
    highmul(s, s, s2, i, i);        // s * s 存储在 s2 中
    highmul(s2, s1, s3, i + i, j);  // (s * s) * s1 存储在 s3 中

    output(s3, res);  // 输出乘法结果
    return;
}

// 高精度乘法函数:计算 a 和 b 的乘积并存储到 c 中
void highmul(int a[], int b[], int c[], int size_a, int size_b) {
    for (int i = 0; i < size_a; i++) {
        for (int j = 0; j < size_b; j++) {
            c[i + j] += a[i] * b[j];        // 累加乘积到 c 数组
            c[i + j + 1] += c[i + j] / 10;  // 处理进位
            c[i + j] %= 10;                 // 保持当前位
        }
    }
    return;
}

// 输出高精度数值
void output(int a[], char res[]) {
    int i = 25;
    while (i >= 0 && a[i] == 0) {  // 跳过前导零
        i--;
    }

    for (int j = 0; j <= i; j++) res[j] = a[i - j] + '0';
    res[i + 1] = '\0';

    return;
}

// 比较函数
int cmp(char a[], char b[]) {
    if (strlen(a) > strlen(b)) {
        return 1;
    } else if (strlen(a) < strlen(b)) {
        return -1;
    } else {
        if (strcmp(a, b) > 0) {
            return 1;
        } else if (strcmp(a, b) < 0) {
            return -1;
        } else if (strcmp(a, b) == 0) {
            return 0;
        }
    }
}
子任务 #1
Accepted
得分:100
测试点 #1
Accepted
得分:100
用时:5 ms
内存:328 KiB

输入文件(1.in

8000000320000000000000000

答案文件(1.out

200000000

用户输出

200000000

系统信息

Exited with return code 0
测试点 #2
Accepted
得分:100
用时:5 ms
内存:336 KiB

输入文件(1 - 副本.in

1377

答案文件(1 - 副本.out

9

用户输出

9

系统信息

Exited with return code 0
测试点 #3
Accepted
得分:100
用时:5 ms
内存:324 KiB

输入文件(1 - 副本 (2).in

6774760676539397793720024

答案文件(1 - 副本 (2).out

189218958

用户输出

189218958

系统信息

Exited with return code 0