取模运算
- n % p得到结果的正负由被除数n决定,与p无关。
例如:7%4 = 3, -7%4 = -3, 7%-4 = 3, -7%-4 = -3。
常用的性质
(a * b) % p = (a % p * b % p) % p
(a + b) % p = (a % p + b % p) % p
更多相关性质参考
https://my.oschina.net/u/572632/blog/268778
求两个数的平均数
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
const int MA = 0x7fffffff; // INT 最大 = 2147483647
const int MI = - MA - 1; // INT 最小 = - 2147483648
// 求平均数的函数
int avef(int a, int b)
{
if ((a > 0 && b > 0) || (a < 0 && b <0)) // 同号时的处理
{
if (a > b){
return b + (a - b) / 2;
}
else{
return a + (b - a) / 2;
}
}
return (a + b) / 2; // 异号时的处理
}
int main()
{
int a = MA - 1;
int b = MA - 3;
int sumab = a + b; // -6 ;
int c = (a + b) / 2; // MA - 2 / -3
int ave;
if (a > b){
ave = b + (a - b) / 2;
}
else{
ave = a + (b - a) / 2;
}
printf("%d\n%d\n%d\n", sumab, c, ave);
printf("%d", avef(a, b));
printf("%d", avef(a, b));
return 0;
}
两个正数 或 两个负数相加 可能会溢出, 但是相减肯定不会溢出
ave = (a + b) / 2 = b + (a - b) / 2 = a + (b - a) / 2
不使用变量交换两个int变量
#
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
const int MAX_INT = 0x7fffffff; // INT 最大 = 2147483647
const int MIN_INT = - MAX_INT - 1; // INT 最小 = - 2147483648
int main()
{
int a = MAX_INT - 1;
int b = MAX_INT - 3;
// 不用新的变量 交换两个变量的值,虽然会溢出,但最后结果仍然正确
a = a + b;
b = a - b;
a = a - b;
printf("%d\n%d\n