编程基础04

常用模运算性质

初等数论:模运算的性质

  1. 加法模运算的性质:(a + b) % m = (a % m + b % m) % m
  2. 减法模运算的性质 :(a - b) % m = (a % m - b % m) % m
  3. 乘法模运算的性质:(a * a) % m = (a % m * a % m) % m

在大数操作例如幂运算过程中使用取模运算

原码 反码 补码

正数

原码=反码=补码

负数
原码: 1000 … 0101
反码: 1111 … 1010 原码除了符号位全部按位取反
补码: 1111 … 1011 反码+1

计算机都自动转化成补码进行运算

为什么要用补码运算? 例如:

1 + -1 = 0
0000 0001 1
1000 0001 -1
1000 0010 -2
//反码:解决了1 + -1 = -2 的问题,但是存在+0 -0
//补码:解决了+0 -0 的问题

位运算

按位与& 按位或| 按位异或^ 按位取反~ 右移>> 左移<<

按位与&

&a 取地址符 单目运算符(这种取地址通常只取首地址)

&& 逻辑与

a&b 按位与 双目运算符

例:a = 60,b = 13
0011 1100

​ & 0000 1101

​ 0000 1100

按位或|

​ 0011 1100

​ | 0000 1101

​ 0011 1101

按位异或^

​ 0011 1100

​ ^ 0000 1101

​ 0011 0001

按位取反~

​ ~ 0011 1100

​ 1100 0011

右移>>

a = 60 a >> 2 整体向右移动,左边补符号位
0011 1100
00 111100

—>符号位是0,左边补零,右边舍掉

​ 0000 1111

左移<<

a = 60 a << 2 整体向左移动,右边补零

​ 0011 1100
001111 00

左边舍去,右边补零

​ 1111 0000

作业

1427分苹果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main()
{
int i = 1;
int n;
cin >> n;
int sum = 0;
while (i <= n)
{
sum += i;
i++;
}
cout << sum << endl;
return 0;
}

1404求阶乘

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
int main()
{
int n, s = 1;
cin >> n;
for(int i = 1; i <= n; i++)
{
s *= i;
}
cout << s << endl;
return 0;
}

1403输出奇偶数之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
using namespace std;
int main()
{

int n;
cin >> n;
int i = 1;
int odd = 0, even = 0;
while (i <= n)
{
if (i % 2 == 0)
{
even += i;
}
else
{
odd += i;
}
i++;
}
cout << even << " " << odd << endl;
return 0;
}

1420津津的储蓄计划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<iostream>
using namespace std;
int main()
{
int left = 0; // 上个月 / 剩余的钱
int cost;
int mom;
for (int i = 1; i <= 12; i++)
{
cin >> cost;
// 计算开销
left = left + 300 - cost;
if (left < 0)
{
cout << -i << endl;
return 0;
}
// += -= ... a += 1 a = a + 1
mom += left / 100 * 100;
left -= left / 100 * 100;
}
cout << left + mom * 1.2 << endl;
return 0;
}

课堂练习

1416人口增长

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
using namespace std;
int main()
{
double x, n;
cin >> x >> n;
for (int i = 1; i <= n; i++)
{
x *= 1.001;
}
printf("%.4lf", x);
return 0;
}

1324判断闰年

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
using namespace std;
int main()
{
// 1.四年一闰,百年不闰
// 2.四百年一闰
int year;
cin >> year;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
{
cout << "Y" << endl;
}
else
{
cout << "N" << endl;
}
return 0;
}

609求1000到2000内的闰年

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main()
{
// 1.四年一闰,百年不闰
// 2.四百年一闰
for (int year = 1000; year <= 2000; year += 4)
{
if (year % 100 != 0 || year % 400 == 0)
{
cout << year << " ";
}
}

return 0;
}

1430幂的末尾

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
int ans = 1, m = 1000;//一定要定义一个ans,否则会多乘一个a
for (int i = 1; i <= b; i++)
{
ans *= a;
ans %= 1000;

// ans = ans * a % m;
}
printf("%03d", ans);
return 0;
}

编程基础04
http://yjmanman.github.io/2024/09/13/04/
作者
YuJia
发布于
2024年9月13日
许可协议