信奥竞赛

系列

剑指信奥 | C 语言之信奥试题详解(二)

上次课的思考题

这个六位数要连续除三个数,结果一定是整数吗?如果不是的话,输出 %d 是否有问题?

还记得公式吗:

六位数 = 三位数 * 1000 + 三位数

如果提取一下公因式就变成了:

六位数 = 三位数 * (1000 + 1)

进而:

六位数 = 三位数 * 1001

而:

7 * 11 * 13 = 1001

所以最后的结果就是三位数本身!

No. 1 填充矩形 🌟

题目
题目描述

已知矩形的大小为 n × m,现用 a × a 的正方形填充该矩形。

输入三个正整数 n, m, a(n, m, a ≤ 10^9),计算至多能填入多少正方形?(正方形可以正好碰到矩形边界,但不能超出矩形外)

输入

一行三个用一个空格隔开的正整数 n, m, a。

输出

输出能填入正方形的数量。

样例输入

3 4 1

样例输出

12

数据范围限制

1 <= n, m, a ≤ 10^9

题解
题目分析

这道题我们需要画张图分析一下:

示意图

从图中不难看出,我们的摆放正方形是有策略的,就是从矩形的一角开始向其他两个方向延伸,直到放不下为止,这时正方形的个数就是最多的。

那问题来了,怎么把这个转换成代码呢?

在分析一下,能放下和放不下的判断依据是什么呢?

就是当前剩余的长度是否能够整除 a。

所以,最多的方块数就是:

(n 中 a 的个数) * (m 中 a 的个数)

到此为止,我们的解题思路就有了。

注意事项
  1. 注意 n, m, a 的数据范围是 10 的 9 次方,需要使用 long 型存储变量。
  2. 整形除法的规则是截去余数,正好适用于这道题。

解题过程

  1. 输入 n, m, a
  2. 求出 n / a 和 m / a
  3. 以上结果相乘并输出
参考代码
#include <stdio.h>
int main() {
    long n, m, a;
    scanf("%ld %ld %ld", &n, &m, &a);
    long z = (n / a) * (m / a);
    printf("%ld", z);
    return 0;
}
                

No. 2 存款收益 🌟

题目
题目描述

按年利率 R% 存入本钱 X,存入 P 年后的本利合计为 X * ((100 + R) / 100) ^ P,求 Y 的值。

输入

输入一行三个空格隔开的实数 R, X,P

输出

输出收益 Y,答案保留两位小数。

样例输入

1 100 5

样例输出

105.10

数据范围限制

1 <= X <= 10000 1 <= P, R <= 100

题解
题目分析

这道题考察的是基本运算,按照公式求出结果即可。

注意事项
  1. 需要引入 math.h,乘方函数是 pow()
  2. 注意录入 r, x, p 的顺序
解题过程
  1. 输入 r, x, p
  2. 计算并输出
参考代码
#include <stdio.h>
#include <math.h>

int main() {
    double r, x, p, y;
    scanf("%lf %lf %lf", &r, &x, &p);
    y = x * pow((100 + r) / 100, p);
    printf("%.2lf", y);
    return 0;
}
                

No. 3 捡石头 🌟

题目
题目描述

憨厚的老农夫昨天捡到了 3 块小石头,他想再去捡一个小石头,让这 4 个石头正好一共重 20 斤,请问他应该去捡一个多少斤的石头?

输入

三个整数 a, b, c,是这三个石头的重量 (斤)

输出

一个数,表示农夫应该去捡一个多少斤的石头。

样例输入

3 5 7

样例输出

5

题解
题目分析

这道题是一个基本的运算题。要想知道还要捡多少斤的石头,应该先知道已经捡了多少斤,然后用 20 做减法就可以了。

注意事项
  1. 注意题目要求的数据类型是整形
解题过程
  1. 输入 a, b, c
  2. 运算并输出
参考代码
#include <stdio.h>
int main() {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    printf("%d", 20 - (a + b + c));
    return 0;
}