二、阅读程序
1、阅读以下程序
#include <cstdio>
#include <cstring>
using namespace std;
char st[100];
int main() {
scanf("%s", st);
int n = strlen(st);
for (int i = 1; i <= n; ++i) {
if (n % i == 0) {
char c = st[i - 1];
if (c >= 'a')
st[i - 1] = c - 'a' + 'A';
}
}
printf("%s", st);
return 0;
}
【分析】此题代码逻辑比较清晰简单,输入一个字符串,然后依次遍历每一个字符,同时判断,下标i是否是字符串长度n的约数,若是则继续判断字符是否是大于’a’的字符,若是则将其转换为大写字母。
•判断题
1、输入的字符串只能由小写字母或大写字母组成。()
错误,根据分析,程序并无该限制
2、若将第8行的“i = 1”改为“i = 0”,程序运行时会发生错误。()
正确,第8行是for循环遍历每一个字符,i从1至n,若将“i = 1”改为“i = 0”,显然i=0时,n%i会产生错误结果,然后st[i-1]得到st[-1]会发生数组越界。
3、若将第8行的“i <= n”改为“i * i <= n”,程序运行结果不会改变。()
错误,修改后,遍历的范围就变小了,结果显然是可能改变的
4、若输入的字符串全部由大写字母组成,那么输出的字符串就跟输入的字符串一样。()
正确,因为遍历字符的时候,只是有条件地把部分字符做了大写转换,若原字符串本身都是大写字母构成,则处理后,输出结果与输入结果相同
•选择题
5、若输入的字符串长度为18,那么输入的字符串跟输出的字符串相比,至多有()个字符不同。
这里转换一下思路,长度n=18,只有那些下标是18的约数的字符才有可能被更新,所以看18有多少个约数即可,直接枚举可得1,2,3,6,9,18,共6个
6、若输入的字符串长度为(),那么输入的字符串跟输出的字符串相比,至多有36个字符不同。
与第5题一样,此题是找出选项里哪个数的约数36个,根据质因数分解定理,若一个正整数P的质因数分解为:
P = p 1 r 1 ∗ p 2 r 2 ∗ . . . ∗ p n r n P=p_1^{r_1}*p_2^{r_2}*...*p_n^{r_n} P=p1r1∗p2r