题解 P6723 【[COCI2015-2016#5] ZAMKA】

题目比较水,暴力可过,不需要太多铺垫知识,先来看下。


前言

如何计算每个数各位数字之和呢?比如说:$5123$这个数,其对10取模即为最后一位数字的值( $5123 % 10 = 3$ )。然后第二位呢?那么此处循环处理,将其 /10 ,可得到$512$ (此数为int,不会有小数,而且没有四舍五入),以此类推,易得其和为:11。


分析

先看数据范围, $10^4$ ,这样暴力相当于2层循环,可行。


实现

本题用上述方法,将其整合一下,得到如下计算数位总和的函数:

int sum(int s) {
int cnt = 0;
while (s) {
cnt += s % 10;
s /= 10;
}
return cnt;
}

将其放在主程序前,程序中,i从l循环到r,对于每个 $i$ 计算,若与 $x$ 相等,则更新 $min$ 和 $max$ 的值即可。

此处给出主函数,再写不出来……

int main() {
cin >> l >> d >> x;
int mi = 0x3f3f3f3f; //新手特别易错,这里一定要注意,之后最小值不会小于0,所以初始化为无穷大(见后记)
int ma = 0;
for (int i = l; i <= d; i++) {
int s = cnt(i);
if (s == x) {
mi = min(mi, i); //这里规范一点的话还是引入一下algorithm库,不过问题不大,iostream有时候会一起引入一些常用函数,考试注意即可。
ma = max(ma, i);
}
}
cout << mi << endl << ma << endl;
return 0;
}

后记

没什么太多好说的,讲一下 $C++$ 无穷大的设置吧。

对于整数类型 $int$ 来说,常见的有3种无穷大值。

一:(最靠谱)

$0x3f3f3f3f$

为什么说它最靠谱呢?这里的数转化为十进制(0x开头为16进制)之后,结果为 $10 ^ 9$ 多一点,但接下来讲的第二种数两个相加就会溢出了,有点风险。但这个数并不会,可以做到 $inf + inf$ 的情况。

二:

$0x7ffffff$

类似于第一种,区别上面讲到过了,知道即可,自己最好还是用第一种。

三:(直接上极限,但可能数不够大或不小心写错位数

int inf = 1e9;

这里 $1e9$ 其实是浮点数,强转之后和 $10^9$ 数值上相等,千万别把位数写错!!!

完结撒花~管理大大过一下吧~