在刷剑指offer的题目时:
题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
我的代码:
class Solution {
public:
int cutRope(int number) {
if(number<=1)
return 0;
else if(number==2)
return 1;
else if(number==3)
return 2;
else
{
int x=number/3;
int y=number%3;
if(y==0)
{
return int(std::pow(3, x));
}
else if(y==1)
{
return int(4*std::pow(3, x-1));
}
else if(y==2)
{
return int(2*std::pow(3, x));
}
}
}
};
结果编译出错:
编译错误:您提交的代码无法完成编译
In file included from main.cc:2:
./solution.h:27:5: error: non-void function does not return a value in all control paths [-Werror,-Wreturn-type]
}
^
1 error generated.
百度发现
not all control paths return a value 这句话的意思是函数并不是所有分支都有返回值。
分析代码
if(y==0)
{
return int(std::pow(3, x));
}
else if(y==1)
{
return int(4*std::pow(3, x-1));
}
else if(y==2)
{
return int(2*std::pow(3, x));
}
这里只包括了y=0 、1、2,三种情况,事实上由于输入参数number是整数,确实也只有这三种情况,但编译器不这样认为,编译器认为还存在其他情况,所以把 else if(y==2)改称else就能包含所有情况了,编译也就不会出现有的情况没有返回值的情况了。
修改
class Solution {
public:
int cutRope(int number) {
if(number<=1)
return 0;
else if(number==2)
return 1;
else if(number==3)
return 2;
else
{
int x=number/3;
int y=number%3;
if(y==0)
{
return int(std::pow(3, x));
}
else if(y==1)
{
return int(4*std::pow(3, x-1));
}
else
{
return int(2*std::pow(3, x));
}
}
}
};