第二次讲课内容(函数和快速幂)

函数

在c语言中 main() 就是一个函数,它是程序的主函数。

函数定义的一般格式:

返回类型 函数名(参数列表){
	函数体
}

返回类型

  • 一个函数可以返回一个值,返回类型就是对应的值的类型。常见的有int、long long、bool、double、float,如果函数没有返回值就用void

函数名

  • 自定义名称
  • 字母、数字、下划线混合使用,但是只能以字母或下划线开始

参数列表

  • 传递参数时要和参数列表中的顺序、数量、类型相对应
  • 参数是可选的,函数可以不包含参数

函数体

  • 自定义的执行语句

实例

自定义Max(),返回num1,num2中的最大值

int Max(int num1, int num2) {

	if (num1 > num2)
		return num1;
	else
		return num2;
}

函数声明

  • 函数声明告诉编译器函数的名称、如何调用函数

  • 一般格式为返回类型 函数名(参数列表);

  • 对于上面定义的 Max() 函数,声明函数为int Max(int num1, int num2);

  • 在函数声明中参数的名称不重要,参数的类型是必要的。因此也可以这样声明int Max(int, int);

函数的调用

函数定义之后,通过调用完成指定的操作, 当程序调用函数时,程序就会执行函数体中的语句直到执行完毕return返回,这样就完成了一次调用

#include <iostream>
using namespace std;
int Max(int num1, int num2) {

	if (num1 > num2)
		return num1;
	else
		return num2;
}

int main() {

    int a = 10;
    int b = 20;
    // 调用函数并输出结果
    cout << Max(a, b) << endl;
    
    return 0;
}

小练习

  • 判断闰年
  • 求圆的面积

快速幂

问题

a b % p a^{b} \%p

思路

  • 最容易想到的是循环求值,循环操作b次每次乘以a,时间复杂度O(n)
int p = 10000007;
int a = 2, b = 10;
int ans = 1;
for (int i = 1; i <= b; ++i) {
	ans = (ans * a) % p;
}
cout << ans << endl;
  • 当指数很大的时候上面的方法就有些慢,这里我们就学习一下快速幂的方法

例如我们求
2 11 = 2 ( 1011 ) 2 = 2 8 × 1 × 2 4 × 0 × 2 2 × 1 × 2 1 × 1 \begin{aligned} 2^{11} &amp;=2^{(1011)_{2}} \\&amp;=2^{8}\times1\times2^{4}\times0\times2^{2}\times1\times2^{1}\times1 \end{aligned}
通过观察上式,我们可以将指数转化为2进制,变量Ans记录结果,变量T记录当前二进制对应的值,不难发现二进值每高一位,对应的   T = T 2 \ T=T^{2} ,而二进制的状态0和1表示是否要乘上T

typedef long long LL;
LL quick_pow(LL a, LL b, LL p) {
    LL t = a;
    LL ans = 1;
    while (b) {
        if (b & 1)	// 判断当前二进制是否为1
            ans = (ans * t) % p; 	// 如果为1更新ans
        t = (t * t) % p; // 更新下一位的值,并把指数的二进制后移一位
        b >>= 1;
    }
    return ans;
}

猜你喜欢

转载自blog.csdn.net/henuyh/article/details/83312634
今日推荐