2015-03-04 3 views
-1

Я написал некоторый код, относящийся к проблеме, но я просто не могу заставить его работать, после ввода двух чисел программа застревает в бесконечном цикле, есть ли способ, которым этот метод мог бы работать, или он совершенно ошибочен ?Как разделить два числа без использования символа «/»?

import java.util.Scanner; 
public class Arithmetic { 
public static void main(String[] args){ 
Scanner input = new Scanner(System.in); 
System.out.print("Enter the numerator and denominator respectively : "); 
double a = input.nextDouble(); 
double b = input.nextDouble(); 
double c; 
for(c=0;;c+=0.000000000001){ 
    if(b*c==a){ 
     break; 
    } 
} 
System.out.print(c); 
} 
} 
+2

Это будет длиться вечно, и это не будет работать в большинстве случаев, потому что 'double' неточно. – dasblinkenlight

+6

Что я хочу знать, _why_ вам когда-нибудь понадобится это сделать? –

+6

Разделение просто вычитает делитель из разности «n» дивидендов, пока остаток не равен <= 0. Временами «n» является фактор. Если остаток равен <0, то частным является n-1. – algorithmic

ответ

9

я могу думать так без косой черты:

double c = a * Math.pow(b, -1); 

Вы также можете заменить побег Unicode для / характера.

double c2 = a \u002f b; 

Вы также можете преобразовать в BigDecimal с, используйте метод divide, а затем преобразовать фактор обратно в double.

double c3 = new BigDecimal(a).divide(new BigDecimal(b)).doubleValue(); 
+1

, в то время как это технически правильно, оно не соответствует духу упражнения :) – algorithmic

3

Вы можете использовать экспоненту и логарифм ехр еще потому (журнал (а) -log (б)) = а/б

общественного класса HelloWorld {

public static void main(String []args){ 
    System.out.println(Math.pow(10,Math.log10(a)-Math.log10(b))); 
} 

}

Вам нужно добавить чеки для> 0 и b> 0 и сделать логику, чтобы она работала для всех a, b, но это вы можете сделать сами.

Например, если б = 0

ошибка Throw

< если 0 и Ь> 0

System.out.println(-Math.pow(10,Math.log10(-a)-Math.log10(b))); 

т.д.

+1

Я поддержал это, потому что это способ использовать математику, чтобы обойтись с помощью любой реальной операции деления. – rgettman

+1

Фактически log и exp будут вычисляться рядом Taylor/MAcLaurin, где используется деление. Итак, будут дивизии. Но это только моя ставка. Мне нужно увидеть документацию, чтобы увидеть, как они ее вычисляют. – boucekv

0
public class Num { 

public static void main(String[] args) { 


    double num, den, res; 
    num = 10; 
    den = 2; 

    res = Math.pow(Math.E, (Math.log(num)-Math.log(den))); 

    System.out.println(res); 


    } 

} 
Смежные вопросы