четвер, 19 липня 2012 р.

Математичні функції і константи

Математичечні функції і константи
Клас Math містить набор математичних функций, які необхідні для розв'язання задач.
Щоб добути квадратний корінь із числа, застосовують метод sqrt.
double х = 4;
double у = Math.sqrt(х);
System.out.println(у); // Друкує число 2.0.

Между методами println и sqrt есть небольшая разница. Метод println дей­ствует на объект System, out, имея второй параметр у — число, подлежащее вы­воду. (Напомним, что out — это объект, определенный в классе System и пред­ставляющий собой стандартное устройство вывода.)
В то же время метод sqrt в классе Math не работает ни с одним объектом. Он имеет единственный параметр х — число, из которого нужно извлечь корень. Такие методы называются статиче­скими.

В языке Java нет оператора возведения в степень: для этого нужно использовать метод pow из класса Math.
Оператор
double у = Math.pow(x,a) ;
присваивает переменной у значение переменной х, возведенное в степень а.
Оба параметра метода pow, а также возвращаемое им значение имеют тип double.
Класс Math содержит обычные тригонометрические функции:
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2
Math.toDegrees(n) — обчислює градусну міру кута n радіан.
Math.toRadians(n) — обчислює радіанну міру кута n градусів.

Кроме этого, в него включены экспоненциальная и обратная к ней логарифмиче­ская функции (натуральный логарифм):
Math.exp
Math.log
Math.log10(n) — обчислює значення десяткового логарифму числа n.

В классе определены также две константы
Math.PI
Math.E,
обозначающие аппроксимации чисел Пи и е.
Для повышения своей производительности функции в классе Math используют про­граммы из встроенного модуля для вычислений с плавающей точкой.
Если точность вычислений важнее скорости их выполнения, используйте класс strictMath.
Он реализует алгоритмы из библиотеки "Freely Distributable Math Library" ("Свободно распространяемая библиотека математических функций") fdlibm, гарантирующей идентичность результатов на всех платформах.
Исходные тексты программ, реали­зующих эти алгоритмы, можно найти на web-странице http://www.netlib.org/fdlibm/index.html. (В библиотеке fdlibm дается несколько определений каждой функции, класс StrictMath следует версии IEEE754, имена функций в которой на­чинаются с буквы "е".)


Math.abs()  обчислює модуль. Аргумент может мати тип int, float, double или long. Тип byte і short перетворюється  в int.
Приклад:
int num =  -1 ;
Math.abs(num);         // returns 1


 Math.floor()  повертає ціле число, якщо воно менше чи дорівнює параметру.
Приклад:
Math.floor(-5.6)     returns -6.0
Math.floor(201.1)     returns 201.0
Math.floor(100)     returns 100.0


Math.ceil(n) — повертає найближче до числа n справа число з нулевою дробовою частиною Наприклад, Math.ceil(3.4) в результаті поверне 4.0, Math.ceil(9.4) поверне 10.0

Math.round()  округлює аргумент з плавающей крапкою до самого близького числа.
Наприклад, запис Math.round (34.5) повертає 35, Math.round(9.5) повертає10, Math.round(9.5-0.001) поверне 9.

Math.max()  знаходить більше із двух значень. Аргумент може мати тип даних int, long, double і float.
Приклад:
Math.max(100,200)     returns 200

Math.min()  знаходит менше із двух значень. Аргумент може мати тип даних int, long, double і float.
Приклад:
Math.min(100,200)     returns 100    

 Math.random() повертає випадкове число між 0.0 и 1.0 типу double.



Округлення дійсних чисел

В Java немає стандартних функцій для округлення чисел типу double.

Спочатку double призначений для наукових розрахунків, де округлення практично не використовується, оскільки навпаки - потрібна максимально допустима точність.

А ось для фінансових і тому подібних розрахунків призначений клас BigDecimal, де результат може бути представлений абсолютно точно. Ось там є все необхідне, в тому числі, і для округлення потрібним методом і розрядністю.
Зате в BigDecimal немає ніяких sin & cos, які у фінансах не використовуються.



1 спосіб
double d = 12.1354678578862;
d = d * 1000;
int i = (int) Math.round(d);
d = (double)i / 1000;


2 спосіб через RoundingMode
double newDouble = new BigDecimal(templateDouble).setScale(3, RoundingMode.UP).doubleValue();}




BigDecimal.ROUND_UP
Rounding mode to round away from zero. Always increments the digit prior to a nonzero discarded fraction. Note that this rounding mode never decreases the magnitude of the calculated value.
BigDecimal.ROUND_DOWN 
Rounding mode to round towards zero. Never increments the digit prior to a discarded fraction (i.e., truncates). Note that this rounding mode never increases the magnitude of the calculated value.
BigDecimal.ROUND_CEILING 
Rounding mode to round towards positive infinity. If the BigDecimal is positive, behaves as for ROUND_UP; if negative, behaves as for ROUND_DOWN. Note that this rounding mode never decreases the calculated value.
BigDecimal.ROUND_FLOOR 
Rounding mode to round towards negative infinity. If the BigDecimal is positive, behave as for ROUND_DOWN; if negative, behave as for ROUND_UP. Note that this rounding mode never increases the calculated value.
BigDecimal.ROUND_HALF_UP
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. Behaves as for ROUND_UP if the discarded fraction is >= 0.5; otherwise, behaves as for ROUND_DOWN. Note that this is the rounding mode that most of us were taught in grade school.
ROUND_HALF_DOWN 
Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. Behaves as for ROUND_UP if the discarded fraction is > 0.5; otherwise, behaves as for ROUND_DOWN.
BigDecimal.ROUND_HALF_EVEN 
Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant, in which case, round towards the even neighbor. Behaves as for ROUND_HALF_UP if the digit to the left of the discarded fraction is odd; behaves as for ROUND_HALF_DOWN if it's even. Note that this is the rounding mode that minimizes cumulative error when applied repeatedly over a sequence of calculations.
BigDecimal.ROUND_UNNECESSARY 
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. If this rounding mode is specified on an operation that yields an inexact result, an ArithmeticException is thrown.

Заверщение "Целочисленная арифметика"


2.37. Данную задачу я упростил. Так как условия задачи не понял ни я ни все мои друзья.

Даны целое число k (1 <= k <=99) и последовательность цифр
10111213...9899, в которой выписаны подряд все двузначные числа.
Определить:
а) номер пары цифр, в которую входит цифра k:
Примечание:
Величины строкового типа не использовать.


  1. public class Porad {  
  2.    public Porad() {}   
  3.        public static void main(String[] args) {  
  4.          int k=3;  
  5.          int i;  
  6.              for (i=10;i<100;i++) {  
  7.                 if (k==i) {System.out.print(" "+i);continue;}  
  8.              if (k==i/10) {System.out.print(" "+i);continue;}  
  9.              if (k==i%10) System.out.print(" "+i);  
  10.           }  
  11.     }  

Довга арифметика


Якщо вам недостатньо точності вбудованих цілочисельних типів і чисел з плаваючою точкою, можна звернутися до двох корисним класах пакет java. math під назвою Biglnteger і BigDecimal. Ці класи призначені для маніпуляцій з числами, що складаються з довільної кількості цифр. Класи Biglnteger і BigDecimal реалізують арифметичні операції довільної точності для цілих і дійсних чисел відповідно. 
При цьому числа розміщуються в сукупності послідовних байтів необхідної довжини. Природно, що ефективність будь-яких операцій над такими числами значно нижче, ніж над величинами типу int.

Для перетворення звичайного числа велике використовується статичний метод valueOf:

Biglnteger а = Biglnteger.valueof(100);

На жаль, до великих чисел не можна застосовувати звичайні математичні оператори + і *.
Замість цього програміст повинен використовувати методи add і multiply з класів для роботи з великими числами.
BigInteger с = a.add(b); // с = a + b
BigInteger d = с.multiply(b.add(BigInteger.valueOf(2))); // d - с * (b + 2)


API:
java.math.BigInteger 1.1
- Biglnteger add(Biglnteger other)
- Biglnteger subtract(Biglnteger other)
- Biglnteger multiply(Biglnteger other)
- Biglnteger divide(Biglnteger other)

- Biglnteger mod(Biglnteger other)

Ці функції повертають суму, різницю, добуток, частку і залишок від ділення великого числа на значення змінної other.

- int compareTo(Biglnteger other)
Повертає 0, якщо дане велике число дорівнює значенню змінної other, від'ємне число, якщо дане велике число менше значення змінної other, і позитивне число в іншому випадку.

- static Biglnteger valueOf(long x)
Повертає велике число, значення якого дорівнює значенню змінної х.

 API:
java.mathBigDecimal 1.1
- BigDecimal add (BigDecimal other)
- BigDecimal subtract (BigDecimal other)
- BigDecimal multiply (BigDecimal other)
- BigDecimal divide (BigDecimal other, int roundingMode)
Повертає суму, різницю, добуток і частку від ділення десяткового числа на значення змінної other. Щоб обчислити частку, потрібно підтримувати режим округлення. Режим BigDecimal.
HALF ROUND UP означає звичайне округлення (тобто у бік зменшення, якщо остання цифра менше 5, і в бік збільшення, якщо вона більше 5). Для звичайних обчислень цього достатньо. Інші режими округлення описані в документації по інтерфейсу API.

- int compareTo(BigDecimal other)
Повертає 0, якщо дане число типу BigDecimal дорівнює значенню змінної other, від'ємне число, якщо дане число менше значення змінної other, і позитивне число в іншому випадку.

- static BigDecimal vaiueOf (long x)
- static BigDecimal vaiueOf (long x, int scale)

Повертає велике десяткове число, значення якого дорівнює значенню змінної х або х/10scale



Работа с большими числами в Java

 

Приклад:

додавання двох чисел (числа знаходяться у файлі)

import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class Main{

public static void main(String[] argv) throws IOException{
new Main().run();
}
PrintWriter pw;
Scanner sc;
public void run() throws IOException{
sc = new Scanner(new File("input.txt"));

BigInteger a,b;
  a=sc.nextBigInteger();
  b=sc.nextBigInteger();
  System.out.println(a.add(b));

pw = new PrintWriter(new File("output.txt"));
pw.println(a.add(b));
pw.close();
}
}

Величини логічного типу

Термін «логічні» прийшов в електроніку з алгебри логіки, що оперує зі змінними величинами і їхніми функціями, що можуть приймати тільки два значення: «істинно» чи «хибно». Для позначення істинності чи хибності висловлювань використовують відповідно символи 1 чи 0. Кожна логічна змінна може приймати тільки одне значення: 1 чи 0. Ці двійкові змінні і функції від них називаються логічними змінними і логічними функціями. Пристрої, що реалізують логічні функції, називаються логічними або цифровими пристроями.

Таблиця булевих логічних операторів
Оператор Результат Оператор Результат
1 & логічне І (AND) 7 &= І (AND) з присвоєнням
2 | логічне АБО (OR) 8 = або (OR) с присваиванием
3 ^ логічне виключаюче АБО (XOR) 9 ^= исключающее ИЛИ (XOR) с присваиванием
4 || оператор OR швидкої оцінки виразів (short circuit OR) 10 = = дорівнює
5 && оператор AND швидкої  оцінки виразів (short circuit AND) 11 != не дорівнює
6 ! логічне унарне заперечення (NOT) 12 ? : тернарний оператор if-then-else 

 Приклад:
а>5                               a>5;
1<a<7                           1<a && a<7;
x<0 або x>5                  x<0 || x>5  ;

3.1. Вычислить значение логического выражения при следующих значениях логических величин А, В и С: А = Истина. В = Ложь, С = Ложь:
а) А или В;
б) А и В;
в) В или С.

  1. public class Logic {  
  2.       public Logic() {  
  3.     }  
  4.            public static void main(String[] args) {  
  5.                 boolean a=true;  
  6.                 boolean b=false;     
  7.                 boolean c=false;   
  8.                 System.out.println("(A or B)="+(a|b));        
  9.                 System.out.println("(A and B)="+(a&b));  
  10.                 System.out.println("(B or C)="+(b|c));  
  11.         }  
  12. }  

3.3. Вычислить значение логического выражения при следующих значениях логических величин А, В и С: А = Истина, В = Ложь, С = Ложь:
а) не А и В;
б) А или не В;
в) А и В или С.

  1. public class Logic {  
  2.       public Logic() {  
  3.     }  
  4.            public static void main(String[] args) {  
  5.                 boolean a=true;  
  6.                 boolean b=false;     
  7.                 boolean c=false;   
  8.                 System.out.println("(no A and B)="+(!a&b));        
  9.                 System.out.println("(A or no B)="+(a|!b));  
  10.                 System.out.println("(A and B or C)="+(a&b|c));  
  11.         }  
  12. }  

3.27. Записать логические выражения, которые имеют значение Истина только при выполнении указанных условий:
а)х >2 и у> 3;

  1. public class Logic {  
  2.       public Logic() {  
  3.     }  
  4.            public static void main(String[] args) {  
  5.                 int x=3;  
  6.                 int y=4;     
  7.                        if ((x>2)&(y>3)) System.out.println("TRUE with accept = "+((x>2)&(y>3)));        
  8.       }  

Розгалуження


Конструкція if-else дозволяє в залежності від деякого логічного значення виконувати різні частини програмного програми.  
В загальному випадку оператор записується :
if (логічний вираз) оператор 1; [else оператор2;]

Разділ else необовязковий. 
На місці любого із операторів може стояти декілька операторів (складений оператор), заключений у фігурні дужки. 


if (логічний вираз) {
оператори 1; 
}
[else { 
оператори2;
}]





Логическое выражение это любое выражение, возвращающее значение типа boolean. Это может быть и простая переменная типа boolean. 

Існує чотири логічних оператори - &, &&, | и ||.

Якщо обидва операнда мають значение true, тоді оператори & и && повертають true.

Якщо хоча б один операнд имеет значение true, тоді операторы | и || повертають true.

Оператори & и | завжди перевіряють значение обох операндов.
&& и || носят назву операторів короткої схемы, так как якщо результат булевого виразу може бути визначений із лівого операнда, правий операнд не обчислюється.

Примечание: || и && могут быть использованы только в логических выражениях.



4.1. Рассчитать значение при заданном значении х:
при х>0
sin^2(x)
в противном случае
у =1 - 2sinx^2

  1. import java.lang.Math;    
  2. public class Uslov {  
  3.   public Uslov() {  
  4.     }  
  5.        public static void main(String[] args) {  
  6.         double x=-90;  
  7.         if (x>0) System.out.println("sin^2(x)="+Math.sin(x)*Math.sin(x));   
  8.         else System.out.println("y="+(1-(2*Math.sin(x*x))));  
  9.       }  
  10. }
  11.  
     

4.2. Решение квадратного уранения ax2+bx+c=0


NetBeans IDE 7.1.2 

  1. package javaapplication2;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;

  5. public class JavaApplication2 {
  6.     
  7.     public static void main(String[] args) throws IOException {
  8. System.out.println("Початок програми==> Розв'язок квадратного рівняння");
  9. BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
  10. System.out.println("Введіть a=");
  11. String a_srt=input.readLine();       
  12.       
  13. System.out.println("Введіть b=");
  14. String b_srt=input.readLine();       

  15. System.out.println("Введіть c=");
  16. String c_str=input.readLine();       

  17. int a=Integer.parseInt(a_srt);
  18. int b=Integer.parseInt(b_srt);
  19. int c=Integer.parseInt(c_str);

  20. Float d=(float) b*b-4*a*c;
  21. System.out.println("Розв'язки рівняння "+a+"x^2+"+ b+"x+"+c+"=0");
  22. if (d>=0)
  23.         {
  24.             float x1=(float) ((-b-Math.sqrt(d)/(2*a)));
  25.             float x2=(float) ((-b+Math.sqrt(d))/(2*a));
  26.             System.out.println("х1="+x1);
  27.             System.out.println("х2="+x2);
  28.         }
  29. else
  30.     System.out.println("Немає розв'язків");
  31. System.out.println("Кінець");
  32. }
  33. }   

Багатоваріантне розгалуження (вибір) — оператор switch

 Многовариантное ветвление — оператор switch

Конструкция if/else может оказаться неудобной, если вы стоите перед необходимостью сделать выбор из многих вариантов. В языке Java есть оператор switch, эквивалентный оператору switch из языков С и С++.
Например, создавая систему меню, состоящую из четырех альтернатив, как показано на рис. 3.13, можно использовать следующий код.
String Input = JOptionPane.showInputDialog
("Выберите вариант (1, 2, 3, 4)");
int choice = Integer.parselnt(input);
switch (choice)
{
case 1:

break;
case 2:

break;
case 3:

break;
case 4:

break;
default:
// Неверный выбор.

break;
}

Выполнение начинается с метки case, соответствующей значению переменной choice, и продолжается до следующего оператора break или конца оператора switch. Если ни одна метка не совпадает со значением переменной, выполняется раздел default, если он предусмотрен.
Заметим, что метка case должна быть целочисленной. Нельзя проверять строки. Например, в следующем фрагменте кода сделана ошибка.

Місяць

   Дано ціле число N (1N12), яке видає порядковий номер місяця в році. За введеним значенням N виведіть назву відповідного місяця.

Технічні умови

   Вхідні дані
   Єдине число - порядковий номер місяця у році.
   Вихідні дані
   Єдиний рядок - назва місяця на англійській мові.

Інформація про задачу

Ліміт часу: 1 секунда
Ліміт пам`яті: 64 MB
Бали за пройдений тест: 7.5
Складність: 3% 460/472
Джерело: ДПА 2011 - в.18

Приклад

Приклад вхідних даних

1

Приклад вихідних даних

January

Розв'язок

import java.io.*;
import java.util.*;

public class Main
{
  public static void main(String[] args)   {
     Scanner in = new Scanner(System.in);
     PrintWriter out = new PrintWriter(System.out);

     int a = in.nextInt();
     switch (a)
     {
     case 1:
         out.println("January");
     break;
     case 2:
         out.println("February");
     break;
     case 3:
         out.println("March");
     break;
     case 4:
            out.println("April");
     break;
     case 5:
         out.println("May");
         break;
     case 6:
          out.println("June");
         break;
     case 7:
            out.println("July");
         break;
     case 8:
         out.println("August");
         break;
     case 9:
         out.println("September");
         break;
     case 10:
            out.println("October");
         break;
     case 11:
         out.println("November");
         break;
     case 12:
          out.println("December");
         break;
       
     default:
     // Неверный выбор.
     break;
   
}

     out.flush();
  }
}