计算一个浮点数的立方根,不使用库函数。
保留一位小数。
数据范围:
#include<iostream> #include<iomanip> using namespace std; double gCR(double num); int main() { double num; cin>>num; cout<<fixed<<setprecision(1)<<gCR(num); return 0; } double gCR(double num) { double x=0; //定义最终要返回的结果 double step = 1; //步长 while(1) { //如果将要大于输入值,改变步长 if((x+step)*(x+step)*(x+step)>num) { step /= 10; //不知道为什么至少要有三位小数才能正确四舍五入到一位 //所以这里循环多了一点 if(step == 0.0001) { break; } continue; } x += step; } return x; }3ms还可以
n = float(input()) if n == 0: print('0.0') elif n>0: ans = str(n**(1/3)).split('.') if int(ans[1][1])<5: print(f'{ans[0]}.{ans[1][0]}') else: print(f'{ans[0]}.{int(ans[1][0])+1}') else: n *= -1 ans = str(n**(1/3)).split('.') if int(ans[1][1])<5: print(f'-{ans[0]}.{ans[1][0]}') else: print(f'-{ans[0]}.{int(ans[1][0])+1}')
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNext()) { double num = in.nextDouble(); double left, right, mid = 0.00; left = Math.min(-1.0, num); right = Math.max(1.0, num); while (right - left > 0.001) { mid = (left + right) / 2; if (mid * mid * mid > num) right = mid; else if (mid * mid * mid < num) left = mid; else System.out.printf("%.1f", mid); } System.out.printf("%.1f", right); } } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); float num=0; String str=""; while ((str=bf.readLine())!=null){ num=Float.valueOf(str)*1000000; if(num<0){ num=0-num; for(int i=2;i<num;i++){ if((i*i*i)>num){ float f= 0-(float) (i/100.0); System.out.printf("%.1f",f); System.out.println(); break; } } }else { for(int i=2;i<num;i++){ if((i*i*i)>num){ float f= (float) (i/100.0); System.out.printf("%.1f",f); System.out.println(); break; } } } } } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner s = new Scanner(System.in); while(s.hasNext()){ double n = s.nextDouble(); // 特殊值:0,1,-1,直接输出结果 if(n == 0){ System.out.println(0); continue; } if(n == 1) { System.out.println(1); continue; } if(n == -1) { System.out.println(-1); continue; } double l; double r; // 判断输入值范围,确定左右边界 if(n < -1) { l = n; r = -1; } else if(n > -1 && n < 0) { l = -1; r = n; } else if(n > 0 && n < 1){ l = n; r = 1; } else if(n > 1){ l = 1; r = n; } else { continue; } // 递归计算近似值,二分法 reverse(l, r, n); } } public static void reverse(double l, double r, double n) { double mid = (l + r)/2; double tempResult = mid * mid * mid; double diff = tempResult - n; // 结果保留0.1,则三次方误差为0.001 if((diff < 0 && diff > -0.001) || (diff > 0 && diff < 0.001)) { System.out.println(String.format("%.1f", mid)); return; } else { // 重新设置左右边界 if(tempResult < n){ l = mid; } else { r = mid; } reverse(l, r, n); } } }
n=float(input()) op=-1 if n<0 else 1 n=op*n lr=0.0001 x=0.1 for i in range(1000000): delta=6*(x**2)*(x**3-n) x=x-lr*delta print(op*round(x,1))
#include <stdio.h> #include <math.h> int main() { double input; scanf("%lf",&input); double low=0,high=input; double mid = (low+high)/2.0; while(fabs(input-mid*mid*mid)>0.001) { if(mid*mid*mid > input) { high = mid; }else { low = mid; } mid = (low+high)/2.0; } printf("%.1f",mid); return 0; }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNextDouble()) { double n = sc.nextDouble(); double i = 1; while(i*i*i < n) i++; while(i*i*i > n) i -= 0.1; while(i*i*i < n) i += 0.01; String res = String.format("%.1f", i); System.out.println(res); } sc.close(); } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 牛顿迭代法 while(sc.hasNextDouble()) { double y = sc.nextDouble(); double x; for(x = 1.0; Math.abs(x*x*x - y) > 1e-7; x = (2*x + y/x/x)/3); String res = String.format("%.1f", x); System.out.println(res); } sc.close(); } }
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <string> #include <cmath> using namespace std; double F(double n, double l, double r){ while(r-l>1e-8) { double mid = (l+r)/2; if(pow(mid,3)<n) l = mid; else r = mid; } return l; } int main() { double n; while(cin>>n) { if(n>=0) printf("%.1f\n", F(n,0,max(n,1.0))); else printf("%.1f\n", F(n,min(n,-1.0),0)); } return 0; }
#include<iostream> #include<cmath> #include<math.h> #include<iomanip> using namespace std; double cubeX(double x) { double cur=x; while(fabs(cur*cur*cur-x)>0.0001) cur = cur-(cur*cur*cur-x)/(3*cur*cur); return cur; } int main(void) { double x; cout.precision(2); while(cin>>x) cout<<cubeX(x)<<endl; return 0; }
简单粗暴 #include<stdio.h> int main(void) { double i; double n; bool flag; while(scanf("%lf",&n) != EOF) { flag=0; if(n<0) { n=-n; flag=1; } for(i=0;i*i*i<=n;i=i+0.001); if(flag==0) printf("%.1f\n",i); else printf("%.1f\n",-i); } return 0; }
import java.text.DecimalFormat; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { double input = sc.nextDouble(); System.out.println(getCubeRoot(input)); } } public static double getCubeRoot(double input) { double x0 = 1; double x1 = x0 - (x0 * x0 * x0 - input) / (3 * x0 * x0); while (Math.abs(x1 - x0) > 0.000001) { x0 = x1; x1 = x0 - (x0 * x0 * x0 - input) / (3 * x0 * x0); } DecimalFormat df = new DecimalFormat("#0.0"); return Double.parseDouble(df.format(x1)); } }
import java.text.DecimalFormat; import java.util.*; public class Main { /** * 功能:求解立方根 */ public static double getCubeRoot(double d){ double j = 0.0001; for(double i = 0; i < d; i = i + j){ if((i*i*i - d > 0 && i*i*i - d < 0.01) || (i*i*i - d < 0 && d - i*i*i < 0.01)) return i; } return 0; } public static void main(String args[]) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ double d = sc.nextDouble(); DecimalFormat df = new DecimalFormat("0.0"); System.out.println(df.format(getCubeRoot(d))); } sc.close(); } }
#include <stdio.h> int main() { double input; while(scanf("%lf",&input)>0) { double minn=0,maxn=input; while(maxn-minn>0.001) { double mid=(minn+maxn)/2; if(mid*mid*mid>input) maxn=mid; else minn=mid; } printf("%.1lf",minn); } return 0; }