2 minute read

算法竞赛入门经典的习题,变种题是自己想的和自己添加的,其他的题目则为书本上选取

第二章

水仙花数

输出100-999 中所有的水仙花数, ABC 满足 ABC = A^3 + B^3 + C^3 则称之为水仙花数

适合穷举法

void f_1(void) {
    for (int i = 100; i <= 999; i++) {
        int a, b, c;
        a = i / 100;
        b = i / 10 % 10;
        c = i % 100 % 10;
        if (i == a * a * a + b * b * b + c * c * c)
            printf("%d\n", i);
    }
}

韩信点兵

利用队尾剩余人数求出队伍总人数(人数大于10, 小于100)

input: 2 1 6 input: 2 1 3 output: 41 output: No answer

适合穷举法

void f_1(int a, int b, int c) {
   for (int i = 10; i <= 100; i++) {
       if ((i % 3 == a) && (i % 5 == b) && (i % 7) == c) {
           printf("%d\n", i);
           return;
       }
   }
   printf("No answer.\n");
}

倒三角形

输出n层的倒三角形

void f_1(int n) {
    for (int i = n; i 0; i--) {
        for (int j = n - i; j 0; j--)
            printf(" ");
        for (int j = i * 2; j 1; j--)
            printf("#");
        printf("\n");
    }
}

计算子序列

计算 1/n^2 + 1/(n + 1)^2 + … 1/m^2

double f_1(long long n, long long m) {
    double ans = 0;
    while (n <= m) {
        ans = 1.0 / (n * n) + ans;
        n++;
    }
    return ans;
}

分数化小数

输入a,b,c 计算a/b, 精确到c位

自己实现除法

int division(int a, int b)
{
    int quotient;
    quotient = 0;
    while (a b) {
        quotient++;
        a -= b;
    }
    return quotient;
}

void f_1_1(int a, int b, int c) {
    int quotient, remainder;
    quotient = division(a, b);
    remainder = a - quotient * b;
    remainder *= pow(10, c);
    int decimal;
    decimal = division(remainder, b);
    if ((remainder - decimal * b) % 100000 5)
        decimal++;
    char buffer[200] = { '0' };
    sprintf(buffer, "%d.%d", quotient, decimal);
        printf("%s", buffer);
}

利用系统除法, 转换为string, 取出c位

void f_1_2(int a, int b, int c) {
    char buffer[200] = { '0' };
    sprintf(buffer, "%.100f", (float)a / (float)b);
    int temp;
    int flag = 0;
    for (int i = 0;; i++) {       
        if (buffer[i] == '.') {
            flag = 1;
            temp = i;
        }
        if (flag == 1 && (i - temp) == c) {
            if(buffer[i + 1] - '0' 5)
                printf("%c", buffer[i] + 1);
            else
                printf("%c", buffer[i]);
            break;
        }          
        printf("%c", buffer[i]);
    }
}

分数化小数

用1-9组成 3位数abc, def, ghi,每个数字恰好一次, 使得abc : def : ghi = 1 : 2: 3

穷举法

int check(int i) {
    char buffer[10];
    sprintf(buffer, "%d%d%d", i, i * 2, i * 3);
    int flag = 0;
    char a[10] = {0};
    for (int i = 1; i <= 9; i++) {
        if (a[buffer[i] - '0'] != 'Q')
            a[buffer[i] - '0'] = 'Q';
        else
            return 0;
    }
    return 1;
}
void f_1(void) {
    for (int i = 101; i < 333; i++) {
        if (check(i))
            printf("%d, %d, %d\n", i, i * 2, i * 3);
    }
}

第三章