计算一个浮点数的立方根,不使用库函数。
保留一位小数。
数据范围:
import java.util.Scanner; import java.io.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args)throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Double num = Double.parseDouble(br.readLine()); Double k = 1d; Double num1 = 0d; if (num == 0 ) { System.out.println(0); return; } if (num > 0) { for (Double i = 1d;; i += k) { if (i * i * i == num) { System.out.printf("%.1f", i); return; } else if (i * i * i > num) { i = i - k; k = k / 10; if (k == 0.0001) { num1 = i; break; } } } } if (num < 0) { for (Double i = -1d;; i -= k) { if (i * i * i == num) { System.out.printf("%.1f", i); return; } else if (i * i * i < num) { i = i + k; k = k / 10; if (k == 0.0001) { num1 = i; break; } } } } System.out.println(String.format("%.1f", num1)); String str = num1.toString(); } }求大佬指点
// 穷举,笨人用笨方法 public static double resolve(double value) { if (value == 0d || value == 1d || value == -1d) { return value; } if (value == 8d || value == -8d) { return value > 0 ? 2 : -2; } boolean positive = true; if (value < 0) { positive = false; value = -value; } double c = 1e-3; // 误差 boolean isDecimal = value < 1; double base = isDecimal ? 1 : 0; double max = isDecimal ? 1 : value, min = isDecimal ? value : 1; while (true) { double cube = base * base * base; boolean bigger = value > cube; double sub = bigger ? value - cube : cube - value; if (sub <= c) { break; } if (bigger) { min = base; } else { max = base; } base = (max + min) / 2; } return positive ? base : -base; }
import java.util.Scanner; public class HJ107 { public static void main(String[] args) { Scanner in = new Scanner(System.in); //in.hasNextInt(); double a = in.nextDouble(); search(-20.0, 20, a); } public static void search(double l, double r, double t) { double m = (l + r) / 2.0; double v = m*m*m; if (Math.abs(t -v) < 0.0000001) { System.out.printf("%.1f", m); } else if (v > t) { search(l, m, t); } else { search(m, r, t); } } }
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 System.out.print(String.format("%.1f",Math.cbrt(in.nextDouble()))); } }
import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); double num = in.nextDouble(); //记录是正数还是负数 double sign = 1; double result = 0; //不管正负,都取正,以方便运算 if(num<0){ sign = -1; num *= -1; } //由于|val|<=20,所以我们可以知道,它的立方根是在(0,3) //根据输入值的范围,将情况分为三种 //0<=num<1,在[0,1)范围内找 //1<=num<8, 在[1,2)范围内找 //8<=num<20,在[2,3)范围内找 if(num>=0 && num<1){ result = deCub(num,0); }else if(num>=1 && num<8){ result = deCub(num,1); }else{ result = deCub(num,2); } //别忘了乘上sign,以及保留一位小数 System.out.println(String.format("%.1f",result*sign)); } public static double deCub(double num, double low){ //建立一个数组来存储节点值的立方和num之间的差值 double[] distance = new double[10]; //节点值的立方 double cub = 0; //临时最小值 double temp = num; //记录差值最小值所对应节点值 int flag = 0; //从起始值low开始,每次增加0.1,记录差值,并和temp做比较,更新temp值和flag for(int i=0; i<10; i++){ cub = Math.pow(low+i*0.1,3); distance[i] = Math.abs(num-cub); if(distance[i]<temp){ temp = distance[i]; flag = i; } } return low+flag*0.1; } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 获取输入的实数 String num = in.nextLine(); // 定义一个数表示该立方根的左边和右边无限接近的数,只要右边-左边精度在0.0001,则可求得立方根 double left = 0; double right; if (Math.abs(Double.parseDouble(num)) > 1) { right = Math.abs(Double.parseDouble(num)); } else { right = 1; } // 定义一个立方根 double mid = 0; while (right - left > 0.0001) { mid = (right + left) / 2; if (mid * mid * mid > Math.abs(Double.parseDouble(num))) { // 立方根较大,右边数降低为mid right = mid; } else { // 立方根较小,左边数升高为mid left = mid; } } if (num.contains("-")) { // 输出结果,保留一位小数 System.out.print( "-"); System.out.printf("%.1f", mid); } else { // 输出结果,保留一位小数 System.out.printf("%.1f", mid); } } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double n = Double.parseDouble(br.readLine()); double ans=n<0?-ans(-n):ans(n); String str = String.format("%.1f", ans); System.out.println(str); } private static double ans(double n) { //寻找整数部分 int l=1; int r=(int) Math.sqrt(n); int mid=(l+r)/2; while (l<=r){ mid=(l+r)/2; if(Math.pow(mid,3)<n&&Math.pow(mid+1,3)>n){ break; }else if(Math.pow(mid,3)<n){ l=mid+1; }else{ r=mid-1; } } //寻找小数部分,因为仅保留一位小数,则从0.0-0.9中寻找 double ans=mid; int i = 0; for (; i <= 9; i++) { if(Math.pow(ans+i*0.1,3)<=n&&Math.pow(ans+i*0.1+0.1,3)>n){ double abs1=Math.abs(n-Math.pow(ans+i*0.1,3)); double abs2=Math.abs(n-Math.pow(ans+i*0.1+0.1,3)); i= abs1>abs2? i+1 : i; break; } } return mid+i*0.1; } }
import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { double a = 1; double num = scanner.nextDouble(); if (num <= 0) { num = -num; a = -1; } double integer = num / 2; if (num > 0 && num < 1) { while ((integer * integer * integer) < num) { integer += 0.001; } System.out.println(String.format("%.1f", a * integer)); return; } while ((integer * integer * integer) > num) { integer /= 1.0009; } System.out.println(String.format("%.1f", a * integer)); } } }
import java.util.Scanner; /** * 二分法求立方根 */ public class HJ107_二分法求立方根 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); double val=sc.nextFloat(); double low=-20,high=20,mid; mid=low+high/2; while (high-low>0.001&&(mid*mid*mid-val>0.001||mid*mid*mid-val<-0.001)){ mid=(low+high)/2; if (mid*mid*mid-val>0) high=mid; else low=mid; } System.out.printf("%.1f%n",mid); } }
/** * @author YXQ * @create 2022/8/25 17:00 */ import java.util.Scanner; /** * 计算一个浮点数的立方根,不使用库函数。 * 保留一位小数。 * 输入描述: * 待求解参数,为double类型(一个实数) * 输出描述: * 输出参数的立方根。保留一位小数。 */ public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); double d=sc.nextDouble(); System.out.printf("%.1f",findLiFenGen(d)); } public static double findLiFenGen(double d){ double res=0.0; double diff=Double.MAX_VALUE; if(d>=0){ for(double i=0.0;i<d/2+1;i+=0.1){ double temp=d-i*i*i; if(Math.abs(temp)<diff){ res=i; diff=temp; } } }else{ // System.out.println(d/2-1); for(double i=0.0;i>d/2-1;i-=0.1){ double temp=d-i*i*i; // System.out.println(temp); if(Math.abs(temp)<diff){ res=i; diff=Math.abs(temp); } } } return res; } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line = null; line = reader.readLine(); double number = Double.parseDouble(line); double left = -3; double right = 3; double result = curb(number, left, right); System.out.printf("%.1f", result); } public static double curb(double num, double left, double right){ double temp = 0.0; double n1 = Math.pow(left, 3); double n2 = Math.pow(right, 3); if(n1 > num || n2 < num){ return 0; } while(true){ double mid = (left + right) / 2; double n3 = Math.pow(mid, 3); if(num > n3){ left = mid; } if(num < n3){ right = mid; } if(Math.abs(num - n3) < 0.001){ temp = mid; break; } } return temp; } }