ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

九日集训 Day 1 函数

2022-06-01 00:02:09  阅读:180  来源: 互联网

标签:返回 return 函数 int 整数 集训 九日 Day divisor


一、概念定义

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有