Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2017, 23:31   #1
Maxym_Ko
 
Регистрация: 31.10.2017
Сообщений: 4
По умолчанию Как ускорить работу праграммы

Код:
package algotest;

import java.math.BigInteger;
import java.util.Scanner;

public class Dispatcher {

    public static void main(String[] args) {
    	Scanner scan = new Scanner(System.in);
	    BigInteger a = scan.nextBigInteger();
	    BigInteger n = scan.nextBigInteger();
	    BigInteger l = scan.nextBigInteger();
	    BigInteger r = scan.nextBigInteger();
		BigInteger pr;
		BigInteger promres = new BigInteger("0");
		BigInteger j = new BigInteger("1");
		for(BigInteger i = l; !i.equals(r.add(new BigInteger("1"))); i = i.add(new BigInteger("1"))){
			pr = a.multiply(a);
			if(pr.subtract(n.multiply(pr.divide(n))).equals(n.subtract(new BigInteger("1")))){
				if(j.compareTo(l)==-1&&j.compareTo(r)==1||j.compareTo(l)==0||j.compareTo(r)==0){
					promres = promres.add(new BigInteger("1"));
				}
				j = j.add(new BigInteger("1"));
			}
		}
		System.out.println(promres);
    }
}
Maxym_Ko вне форума Ответить с цитированием
Старый 14.11.2017, 00:30   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цикл с индексом BidInteger - это жестоко..
Какая вообще задача?
Black Fregat вне форума Ответить с цитированием
Старый 25.11.2017, 16:04   #3
BleStaR
Форумчанин
 
Регистрация: 25.09.2009
Сообщений: 234
По умолчанию

Это больше похоже на готовую задачу)
(Думаю какая нибудь лабораторная, направленная на проверку понимания языка и умения читать код)

Если проанализировать код (все равно заниматься чем то полезным не охота), то видны два решения: 1) для программиста 2) для математика

Суть первого, сводится к элементарным шагам:
1) Предусмотреть проверку интервалов! L <= R + 1 (иначе зацикливание)
2) замена new BigInteger("1") на BigInteger.ONE и new BigInteger("0") на BigInteger.ZERO
3) вынести из цикла pr = a.multiply(a);
4) вынести из цикла if(pr.subtract... . А сам цикл поместить в этот if, т.к. все вычисления только в нем
5) отдельной переменной вынести r.add(new BigInteger("1")
6) заменить equals на compareTo
7) убрать проверки j.compareTo(l)==-1 && j.compareTo(r)==1
8) а добавив немного математики:
8.1) заменить вынесенный if(pr.subtract...:.
Данные выражение можно представить в сокращенном варианте: pr - n * pr / n == n - 1, сократив ненужное получим n == BigInteger.ONE
Использование оператора == допустимо, т.к. ввод данных через scan.nextBigInteger() проходит проверку на наличие в кэше.
8.2) убрать переменную pr

Второй подход. Данному коду можно дать физическое описание модели:
Цитата:
I движется из точки L в точку R со скоростью 1.
Одновременно с I начинает движение J (из точки 1) с такой же скоростью.
Если до окончания движения I:
J достигнет L или R, тогда 1
J достигнет L и R (исключая L==R), тогда 2
иначе 0
Возможные варианты исходных данных:
Цитата:
|_|_|J|_|_|
|L|R|_|_|_| Интервал слева
|_|L|R|_|_| Правая граница равна J
|_|_|L|R|_| Левая граница равно J
|_|_|_|L|R| Интервал справа
|L|_|_|_|R| Интервал включает J
Код:
static BigInteger quickMethod(BigInteger a, BigInteger n, BigInteger l, BigInteger r) {
        // соблюдение правила физической модели исходной задачи
        if ( l.compareTo(r.add(BigInteger.ONE)) == 1 ) {
            throw new IllegalArgumentException("the variable L must not be greater than R + 1");
        }
        if ( n == BigInteger.ONE ) {
            // изначальное положение J равно BigInteger.ONE
            switch ( l.compareTo(BigInteger.ONE) ) {
                // если левая граница совпадает с J
                case 0:
                    // a) исключительная ситуация: правая граница также равна J тогда 1
                    // б) иначе обе точки будут достигнуты, т.е. 2
                    return r == BigInteger.ONE ? BigInteger.ONE : BigInteger.valueOf(2);
                // если левая граница находится справа
                case 1:
                    // а) на расстоянии большем, чем будет сделано шагов тогда 0 (т.е. J не успеет дойти до L)
                    // б) на расстоянии меньшем, чем будет сделано шагов тогда 1 (будет достигнута L)
                    return r.subtract(l).compareTo(l.subtract(BigInteger.ONE)) == -1 ? BigInteger.ZERO : BigInteger.ONE;
                // если левая граница находится слева
                case -1:
                    // а) если и правая граница слева, тогда 0
                    // б) если правая равна J или справа от нее, тогда 1 (будет достигнута R)
                    return r.compareTo(BigInteger.ONE) == -1 ? BigInteger.ZERO : BigInteger.ONE;
            }
        }
        return BigInteger.ZERO;
    }
BleStaR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как ускорить работу приложения? rownong C# (си шарп) 9 11.08.2017 10:03
Как ускорить работу exel Fedis1 Microsoft Office Excel 2 17.04.2014 19:01
Как ускорить работу этого макроса? Neo007 Microsoft Office Excel 1 22.06.2009 18:14
Как ускорить работу программы SibBear Общие вопросы Delphi 7 27.03.2009 14:40
Как ускорить работу с сетевой БД Ramires БД в Delphi 3 21.08.2008 12:16