前言
今日开始刷算法,今日内容:函数。
做题记录
求1+2+…+n
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
分析思路:不用循环,要实现目的或许可以用递归,以下为递归代码
代码如下(示例):
int sumNums(int n){
if(n==1) return 1;
return n + sumNums(n-1);
}
2 的幂
解题思路:
1、目标值若为2的幂一定可以被2整除,不能则直接输出false
2、此数不断除2最终(倒数第二次,最后一次就整除了)一定为2才能为true
代码如下(示例):
bool isPowerOfTwo(int n){
if(n==1 || n==2) return true;
if( n>2 && n%2==0)
return isPowerOfTwo( n>>1 );
return false;
}
解题思路2:
1、若果n<=0,必然不是2的幂
2、1必然为2的零次幂
3、枚举所有的幂(2、4、8、…、2^31)
4、一旦找到与n相等的,返回true
5、当枚举数超过n的大小时返回false(减少比较次数,不用每次都算到最后),说明不是2的幂
代码如下(示例):
bool isPowerOfTwo(int n){
int i;
unsigned int k = 1;
if(n <= 0){
return false;
}
if(n == 1){
return true;
}
for(i=1 ; i<=31; i++){
k *= 2;
if(k == n){
return true;
}
if(k > n){
return false;
}
}
return false;
}
3 的幂
解题思路:
1、目标值若为3的幂一定可以被3整除,不能则直接输出false
2、此数不断除3最终(倒数第二次,最后一次就整除了)一定为3才能为true
代码如下(示例):
bool isPowerOfThree(int n){
if(n==1 || n==3) return true;
if( n>3 && n%3==0)
return isPowerOfThree( n/3 );
return false;
}
解题思路2:
1、和上题类似,但枚举只需要到20次方,因为3^21超过32位整形上限了
2、枚举值为1、3、9、…、3^20,所以k不断*3
代码如下(示例):
bool isPowerOfThree(int n){
int i;
unsigned int k = 1;
if(n <= 0){
return false;
}
if(n == 1){
return true;
}
for(i=1 ; i<=20; i++){
k *= 3;
if(k == n){
return true;
}
if(k > n){
return false;
}
}
return false;
}
4的幂
解题思路:
1、目标值若为4的幂一定可以被4整除,不能则直接输出false
2、此数不断除4最终(倒数第二次,最后一次就整除了)一定为3才能为true
代码如下(示例):
bool isPowerOfFour(int n){
if(n==1 || n==4) return true;
if( n>4 && n%4==0)
return isPowerOfFour( n/4 );
return false;
}
解题思路2:
1、和上题类似,但枚举只需要到15次方,因为4^16超过32位整形上限了
2、枚举值为1、4、16、…、4^15,所以k不断*4
代码如下(示例):
bool isPowerOfFour(int n){
int i;
unsigned int k = 1;
if(n <= 0){
return false;
}
if(n == 1){
return true;
}
for(i=1 ; i<=15; i++){
k *= 4;
if(k == n){
return true;
}
if(k > n){
return false;
}
}
return false;
}
n 的第 k 个因子
题目描述:给你两个正整数 n 和 k 。如果正整数 i 满足 n % i == 0 ,那么我们就说正整数 i 是整数 n 的因子。考虑整数 n 的所有因子,将它们 升序排列 。请你返回第 k 个因子。如果 n 的因子数少于 k ,请你返回 -1 。
解题思路:
定义一个计数用变量
1、枚举所有在1~n的数,一旦满足条件计数器加一
2、一旦枚举目标值到达k次,则说明找到了,返回枚举到的数
3、如果枚举到最后都没有,则说明不存在第k个因子,此时返回-1;
代码如下(示例):
int kthFactor(int n, int k){
int i;
int temp = 0;
for(i = 1; i <= n; i++){
if(n % i == 0){
temp++;
if(temp == k){
return i;
}
}
}
return -1;
}
完全平方数
给定一个 正整数 num ,编写一个函数,如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
进阶:不要 使用任何内置的库函数,如 sqrt 。
解题思路:
递推公式为 n² = 1 + 3 + 5 + … + 2n − 1
1、从1~num不断进行完全平方数枚举;
2、如果某次运算之后平方数=num,说明找到目标值,输出true;
3、若此时枚举的完全平方数已经超过num,则说明次数不是完全平方数,返回false;
4、补充:因题库的测试用例会超出32位,所以枚举数的变量至少需要使用long int才能通过才使用例;
代码如下(示例):
bool isPerfectSquare(int num){
int i = 1;
long int sum = 0;
while(i <= num){
sum += i;
if(sum == num)
return true;
if(sum > num)
return false;
i += 2;
}
return false;
}