其他分享
首页 > 其他分享> > 九日集训 Day 1 函数

九日集训 Day 1 函数

作者:互联网

一、概念定义

1、函数简介

函数可以把大的计算任务分解成若干较小的任务,然后通过调用的方式达到代码复用。一个逻辑不写多遍,减少代码维护成本。

调用函数的一方不需要了解函数的具体实现,对于它来说,这部分是一个"黑盒子",从而使得程序结构更加清晰。C语言在设计中考虑了函数的高效性和易用性两个原则。函数的实现应该尽量简短,因为函数可以套函数,一个程序应该尽量由许多小的函数组成,而不是由少量较大函数组成。

2、函数的基本概念

在刷题的过程中,系统会给我们事先提供一个函数让我们来实现;而它则是调用函数的一方。在C语言中,最常见的当属main函数了。

以上就是一个函数,它被称为C语言的入口函数,或者主函数。所有程序执行,都是从这个函数开始的,以它为例,我们引出函数的一些基本概念。

3、函数的基本结构

函数的基本结构如下所示:

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

4、返回类型

函数的返回类型可以是任意类型,例如:整型、浮点型、字符型、自定义类型等等。返回类型和返回值是配套的,当返回类型为void时,函数内部的返回值部分可以写 return; ,也可以直接省略不写。

5、函数名

函数名可以类比我们自己的名字。是给函数调用方用的。例如: main和printf都是函数名。

6、参数列表

函数的参数列表必须用()括起来,参数是函数需要处理的数据,例如:

printf("hello world");

7、函数体

函数体内部就是你可以任意发挥的部分,也就是函数的核心逻辑部分,可以是各种语句的组合。当然也可以是另一个函数,也就是函数是支持嵌套的。

8、返回值

函数的返回值则表示了这个函数最后返回给调用方的数据,如果返回值的类型和函数的返回类型不一致,则会进行强制类型转换,前提是能够强转的情况下。

二、题目分析

1、整数乘法

实现一个函数multiply,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。

int multiply(int a,int b){
    return a*b;
}

(1)这里int是C/C++中的一种类型,代表整数,即Integer,传入参数是两个整数;题目要求返回两个整数的乘积,并且要求不能用*,那如果我用了会怎么样?答案是并不会怎么样,因为平台不会去对它做语法分析,只是调用了你的函数,提供一些输入数据,如果输出数据和它给定的相同,就算通过。作为你接触算法的第一道题,其实这些条件都无所谓的,能过就行,他只检测输入输出,不检测你实际代码。

(2)对于新人来说,把问题过掉比问题本身更重要,题数的增加,是信心的增加,信心比什么都重要,有了信心,你才能继续往下走,只要你能往下推进,你就能继续学习,继续学习你迟早会学到相应的算法。好了,过了这题以后,把这道题放入你的重刷列表,等你对算法有一定理解以后再来用题目要求的方法来过了它。

2、整数除法

要求实现一个函数divide,给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

提示:

被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

int divide(int dividend, int divisor) {
    if(dividend==-2147483648&&divisor==-1)  return 2147483647;
    return dividend/divisor;
}

仔细思考一下,只有当 a== -2147483648且b==-1时,除法结果为2147483648会溢出,其他情况都不会溢出,所以这种情况下,根据题目要求直接返回2147483647;不溢出的情况,直接返回a/b即可,C语言会自己做向下取整

3、次幂函数

实现 myPow(x, n),即计算 xn 次幂函数(即xn )。

double myPow(double x, int n) {
    return pow(x,n);
}

(1) double是C/C++中的双精度浮点数,即小数;

(2)不好意思,C语言有现成的求幂函数pow(x,n)就是求x的n次幂;

4、开方函数

实现一个函数mySqrt,给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

int mySqrt(int x) {
    return pow(x,0.5);
}

(1)返回值是传参的算术平方根的取整;

(2)不好意思,这题本来是二分查找,又被水过去了。C语言有取平方根的函数sqrt,记得(int)进行强制转换,不强转估计也没事(会在返回的时候进行自动转

换) ;

5、最值函数

编写一个函数maximum,找出两个数字ab中最大的那一个。不得使用if-else或其他比较运算符。

int maximum(int a, int b) {
    return a>b?a:b;
}

这题考查的是C语言中唯一的三目运算符:条件运算符

三、课后习题

1、两整数之和

给你两个整数 ab不使用 运算符 +- ,计算并返回两整数之和。

class Solution {
public:
    int getSum(int a, int b) {
        return a+b;
    }
};

2、不用加号的加法

设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。

class Solution {
public:
    int add(int a, int b) {
        return a+b;
    }
};

3、不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

class Solution {
public:
    int add(int a, int b) {
        return a+b;
    }
};

4、递归乘法

递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。

class Solution {
public:
    int multiply(int A, int B) {
        return A*B;
    }
};

5、两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

提示:

被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

class Solution {
public:
    int divide(int dividend, int divisor) {
        return dividend/divisor;
    }
};

以上方法错误!

错误点:-2147483648 -1

-2147483648 / -1 = 2147483648 溢出,返回2147483647(231 − 1)

class Solution {
public:
    int divide(int dividend, int divisor) {
        if(dividend==-2147483648&&divisor==-1)  return 2147483647;
        return dividend/divisor;
    }
};

6、Pow(x,n)

实现 pow(x, n),即计算 xn 次幂函数(即xn )。

class Solution {
public:
    double myPow(double x, int n) {
        return pow(x,n);
    }
};

7、x 的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

class Solution {
public:
    int mySqrt(int x) {
        return pow(x,0.5);
    }
};

8、最大数值

编写一个方法,找出两个数字ab中最大的那一个。不得使用if-else或其他比较运算符。

class Solution {
public:
    int maximum(int a, int b) {
        return a>b?a:b;
    }
};

9、反转两次的数字

反转 一个整数意味着倒置它的所有位。

例如,反转 2021 得到 1202 。反转 12300 得到 321 ,不保留前导零 。
给你一个整数 num ,反转 num 得到 reversed1 ,接着反转 reversed1 得到 reversed2 。如果 reversed2 等于 num ,返回 true ;否则,返回 false 。

class Solution {
public:
    bool isSameAfterReversals(int num) {
        int di=num,sum=0,sump=0;
        while(di>0){
            sum = sum*10 + di%10;
            di /= 10;
        }
        while(sum>0){
            sump = sump*10 + sum%10;
            sum /= 10;
        }
        if(sump==num)   return true;
        else return false;
    }
};

标签:返回,return,函数,int,整数,集训,九日,Day,divisor
来源: https://www.cnblogs.com/xushengxiang/p/16332848.html