Skip to content

C

Coding Error

# include <stdio.h>

int main()
{
    char* arr1 = "\xef\xbf\xbd\xef\xbf\xbd";
    printf("%s\n", arr1);

    char arr2[1];
    printf("%s\n", arr2);

    char* arr3;
    arr3 = (char*)malloc(6);
    printf("%s\n", arr3);

    char* arr4 = "\xef\xbb\xef\xbb\xef\xbb";
    printf("%s\n", arr4);

    return 0;
}

ISC_Lab

/**
 * ISC_Lab1: 大整数运算
 * 只使用分支、循环、局部变量 (使用整数的位宽至多为64
 * bit)、赋值语句、位运算和加减法实现 $a \times b \mod m$
 */

#include <stdint.h>

uint64_t multimod(uint64_t a, uint64_t b, uint64_t m) {
    while (a > m) {
        a -= m;
    }
    while (b > m) {
        b -= m;
    }
    uint64_t result = 0;
    uint64_t su = UINT64_MAX - m + 1;

    for (uint64_t i = 64; i != 0; --i) {
        // 移位时溢出
        if (result >> 63) {
            result = result << 1;
            result += su;
        } else {
            result = result << 1;
        }
        result = (result > m) ? (result - m) : result;

        if ((a >> (i - 1)) & 1) {
            // 加法溢出(考虑b始终不变, 短路减少重复判断)
            if ((result >> 63 & b >> 63) |
                ((result >> 63 | b >> 63) & (result >> 62 & b >> 62))) {
                result = result + b;
                result += su;
            } else {
                result = result + b;
            }
        }
        result = (result > m) ? (result - m) : result;
    }
    result = (result > m) ? (result - m) : result;

    return result;
}