Здравствуйте всем! У меня возникла проблема, нужно найти все натуральные числа А,В и С в интервале от 1 до 200, для которых будет исполняться равенство А*В=В+С.
Как его более рационально решить, подскажите пожалуйста.
			
			
					
		![]() ![]()  | 
	
| Василий_Решетняк | 
                        
			
			  
			
				 Сообщение
					#1				
			 
		 | 
	
| 
        	
        		 Группа: Пользователи Сообщений: 2 Пол: Мужской Реальное имя: Василий Репутация:    0           	 | 
       
			
			 Здравствуйте всем! У меня возникла проблема, нужно найти все натуральные числа А,В и С в интервале от 1 до 200, для которых будет исполняться равенство А*В=В+С. 
			
			
					
		Как его более рационально решить, подскажите пожалуйста.  | 
	
| Василий_Решетняк | 
                        
			
			  
			
				 Сообщение
					#2				
			 
		 | 
	
| 
        	
        		 Группа: Пользователи Сообщений: 2 Пол: Мужской Реальное имя: Василий Репутация:    0           	 | 
       
			
			 Извините, уже сам додумался. Оказалось совсем легко. Вот код 
			
			
					
		var a,b,c:integer;  | 
	
| TarasBer | 
                        
			
			  
			
				 Сообщение
					#3				
			 
		 | 
	
        	
        		![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация:    62           	 | 
       
			
			 А препод возьмёт, и скажет: 
			
			"Хорошо, молодой человек, а теперь решите мне ту же задачу не для 200, а для 2000." --------------------  | 
	
| Lapp | 
                        
			
			  
			
				 Сообщение
					#4				
			 
		 | 
	
        	
        		![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация:    159           	 | 
       
			
			 Как его более рационально решить, подскажите пожалуйста. Если ты действительно хотел более рациональное решение, то есть пара замечаний. Во-первых, зачем столько begin/end? одиночные оператоы совершенно необязательно заключать в операторные скобки. Во-вторых, число 200 надо задавать константой (ниже увидишь, почему). В третьих, преобразуем то выражение к такому вот виду: A = 1 + C/B Отсюда делаем несколько выводов. 1. Поскольку C/B>0, то A>1. Это значит, что цикл по A можно начинать с 2. 2. C/B должно быть целым, так что C кратно B. Это значит, что внутренний цикл можно вести с шагом B (переделав его с for на while). Все это понижает общее число проверок с 8 000 000 (восемь миллионов) до 218 502, то есть в 36 раз. При увеличении диапазона с 200 до 300 выигрыш доходит до 51 раза, а если увеличить диапазон до 1000, то выиграем в 141 раз. Вот прога, которой я пользовался: const Тут вставлены также подсчеты числа найденных решений и общего количества итераций. P.S. Я уж не говорю, что имеет смысл все же отделять вывод чисел пробелами, а не лепить друг к другу.. Добавлено через 4 мин. Собственно, это не предел оптимизации )). Следующим шагом будет замена тупых циклов на умное деление )). -------------------- я - ветер, я северный холодный ветер 
					
		я час расставанья, я год возвращенья домой  | 
	
| TarasBer | 
                        
			
			  
			
				 Сообщение
					#5				
			 
		 | 
	
        	
        		![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация:    62           	 | 
       
			
			 Lapp, я не только про скорость. 
			
			Вот примени алгоритм для 2000. --------------------  | 
	
| Lapp | 
                        
			
			  
			
				 Сообщение
					#6				
			 
		 | 
	
        	
        		![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация:    159           	 | 
       
			
			 Lapp, я не только про скорость. Вот примени алгоритм для 2000. Тарас, я понимаю, о чем ты, мне для этого не надо применять )). Почему ты думаешь, что я возражаю? )) У тебя очень дельный совет. Я его не видел до отсылки моего ответа. Хотя, конечно, если в условии дано 200, то можно ограничиться типом integer. А со стороны препа будет не совсем корректно менять на 2000. Этак можно и вовсе уехать на 20000000000000000 или больше )). -------------------- я - ветер, я северный холодный ветер 
					
		я час расставанья, я год возвращенья домой  | 
	
| andriano | 
                        
			
			  
			
				 Сообщение
					#7				
			 
		 | 
	
| 
        	
        		 Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация:    28           	 | 
       
			
			 Объясните мне, зачем цикл по А? 
			
			
					
		А нужно просто вычислять.  | 
	
![]() ![]()  | 
	
 
  | 
		Текстовая версия | 4.11.2025 10:22 |