九日集训 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),即计算
x
的n
次幂函数(即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,找出两个数字
a
和b
中最大的那一个。不得使用if-else或其他比较运算符。
int maximum(int a, int b) {
return a>b?a:b;
}
这题考查的是C语言中唯一的三目运算符:条件运算符
三、课后习题
1、两整数之和
给你两个整数
a
和b
,不使用 运算符+
和-
,计算并返回两整数之和。
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),即计算
x
的n
次幂函数(即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、最大数值
编写一个方法,找出两个数字
a
和b
中最大的那一个。不得使用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