链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
神秘的使徒袭击了第三新东京市,少男少女们驾驶着决战兵器EVA守护着人类的和平。
牛可乐是NERV特务机关的指挥官,他必须时刻了解牛牛/牛妹/牛能三人的战斗状态。现在牛可乐获得了这三位EVA驾驶员的战斗力之积,在保证三位驾驶员战斗力均为正实数的情况下,请你帮助牛可乐计算这三位驾驶员的战斗力之和最低是多少?
输入描述:
一个正整数n,表示三位驾驶员的战斗力之积,n<=1e9(10的9次方)
输出描述:
输出三位驾驶员最低的战斗力之和,保留3位小数。
示例1
输入
复制1
1
输出
复制3.000
3.000
分析:将一个正整数拆成3个正整数,怎么拆会让三个数的和最小?
即:已知v = x*y*z,若要使x+y+z最小,a,b,c应取何值?
博主稍微联想了下发现这似乎有点像高数的微积分大题?(一个长方体有盖或者无盖问怎么设置长宽高能使用料最省)
解题过程如下:
因此满足条件的x,y,z的最小值就是对输入的正整数开三次方根
c语言sqrt只能开平方根,开三次方根应该用到pow(操作数,n次方)数学库函数,这里的n不只局限于整数,是可以用分数或者说小数(浮点数)的,当n大于1时是乘方,小于1时就实现了开方。
例如对x开平方根,不止可以写成sqrt(x),也可以写成pow(x,0.5)或者pow(x,1.0/2),在用后者这种分数表达形式时一定注意类型转换,这里隐式转换,还可以写成pow(x,(double/float)1/2)这种显式转换,直接写1/2时计算结果是会把小数部分省略的!
完整代码:
#include<stdio.h>
#include<math.h>
int main()
{
int n;
scanf("%d", &n);
printf("%.3f", pow(n, 1.0 / 3) * 3);//注意输出格式
return 0;
}