《九日集训》第15轮 第二天(第二讲)循环
知识点
循环
for(循环初始化表达式; 循环条件表达式; 循环执行表达式){
循环体
}
题目分析
题目1
分析
题目要求不能使用循环,首先写出
class Solution {
public:
int sumNums(int n) {
if(n==1)return 1;
return n+sumNums(n-1);
}
};
因为题目要求不能用条件表达式,仔细分析一下代码开源发现当\(n<1\)时,\(n\)不变,只有当\(n>1\)的时候,\(n\)才会等于\(n+sumNums(n-1)\)。然后就想到了可以用\(\&\&\)的短路性,
也就是\(n>1\&\&(n=sumNums(n-1))\)
代码
class Solution {
public:
int sumNums(int n) {
bool sum=(n>1)&&(n=n+sumNums(n-1));
return n;
}
};
题目2
分析
这题看书的时候看过,思路是如果一个整数是2的整数次幂,那么转换成2进制的时候只有最高位是1,其他位是0,也就是说\(n\&n-1=0\),要注意\(n=0\)的特殊情况
代码
class Solution {
public:
bool isPowerOfTwo(int n) {
return n>0?(n&n-1)==0:false;
}
};
题目3
分析
由\(n=3^x\)可知,\(\lg n=x\lg 3\)。所以当\(n\)为\(3\)的整次幂时,\(x\)一定是整数,经过测试不能直接取整,不然会卡\(243\)这个数据(呜呜呜),所以判断是否是整数的依据应该是\(|x-round(x)|<10^{-10}\)
代码
class Solution {
public:
bool isPowerOfThree(int n) {
if(n<=0)return false;
double m1=log(n)/log(3);
if(abs(m1-round(m1))<1e-10)return true;
return false;
}
};
题目4
分析
因为\(4^n=2^{2k}\),所以一个数是否是\(4\)的幂要满足两个条件
- 2的幂
- 完全平方数
代码
class Solution {
public:
bool isPowerOfFour(int n) {
if(n<=0)return false;
int num=sqrt(n);
if(num*num!=n)return false;
if((n&n-1)!=0)return false;
return true;
}
};
题目5
分析
定义一个\(count\)记录因子的数量,然后从\(1\)开始枚举到\(n\),如果\(n\%i=0\),\(count++\),由于是从\(1\)开始枚举的,所以一定是升序的,如果\(count=k\),直接返回\(i\)即可,否则返回\(-1\)。
代码
class Solution {
public:
int kthFactor(int n, int k) {
int count=0;
for(int i=1;i<=n;i++){
if(n%i==0){
count++;
if(count==k)return i;
}
}
return -1;
}
};
题目6
分析
二分在判断一下,把昨天那题69. x 的平方根代码改一下就可以氵过去了qwq
代码
class Solution {
public:
bool isPerfectSquare(int num) {
if(num==1)return true;
int l=0,r=num;
const double eps=1; //精度
while(r-l>1){
int mid=(r+l)/2;
if(mid>num/mid) r=mid;
else l=mid;
}
return l*l==num;
}
};
总结
感觉今天的题目偏简单qwq


浙公网安备 33010602011771号