数论—反复取模

判断a的b次方末尾3位数

在计算时可在每次乘a时对1000取模,根据高深的数论知识,结果不影响

1
2
3
4
while(b --){
res *= a;
res %= 1000;
}

R进制转换

对数字进行R进制转换,可用该数字对R取模得到个位,再除以R,再次取模,反复操作以获取各个位置的数,存储于vector中再进行输入

1
2
3
4
5
6
7
//获取每一位方法
while(n){
digits.push_back(n % r);
n /= r;
}
reverse(digits.begin(), digits.end());//获取是从后往前,因此需要反转再输出
//分类讨论,字母可用ASCII码表处理

循环相邻

这是digits字符串中的第(i+1)个字符,但由于使用了模运算%,当i等于len - 1(即字符串的最后一个字符)时,(i+1) % len将得到0,也就是字符串的第一个字符,这样实现了循环相邻的效果

1
2
3
for(size_t i = 0;i < len;i ++){
str[i] = digits[i] + digits[(i+1) % len];
}

密码加密

需要保证ASCII码加密后仍是字母因此使用取模运算

1
2
3
4
5
if (isupper(str[i])) {
str[i] = (str[i] - 'A' + 3) % 26 + 'A';
} else {
str[i] = (str[i] - 'a' + 3) % 26 + 'a';
}