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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2009, 21:39   #1
Knife
 
Регистрация: 03.03.2009
Сообщений: 8
По умолчанию [Pascal]: задачи на массивы, прошу помочь решить

Помогите решить пожалуйста задачи на массивы.

1. 2 натуральных числа называются "дружественными", если каждое из них равно сумме всех делителей (кроме его самого) другого (например, числа 220 и 284), найти все пары "дружественных чисел", которые не больше данного числа N
2. НА плоскости заданы своими координатами n точек. Составить программу, определяющую между какими из пар точек самое большое расстояние. Указание: координаты точек знести в массив.
3. Найдите n-й член геометрической последовательности. Найти сумму первых k членов геометрической прогрессии. Дано: b1,q,n,k
Knife вне форума Ответить с цитированием
Старый 15.04.2009, 23:53   #2
Allen Iverson
Пользователь
 
Аватар для Allen Iverson
 
Регистрация: 15.04.2009
Сообщений: 28
По умолчанию

ответ на вашу проблему...
задача 3 по моему слегка не на массивы...она решается математически...

Код:
program progres;
uses crt;
var b1,q,q_new,summa_k,element_n:real;
    i:integer;
    n,k:integer;
begin
clrscr;
write ('b1 - ');
readln (b1);
write ('q - ');
readln (q);
write ('nomer iskomogo elementa - ');
readln (n);
write ('kol-vo pervyx elementov dlya vicisleniya summi- ');
readln (k);
q_new:=1;
{naxozhdenie elementa_n}
for i:=1 to n-1 do
    begin
    q_new:=q_new*q;
    end;
element_n:=b1*q_new;
writeln (n,'-element geometricheskoy progressii raven ',element_n:0:4);
{naxozhdenie summy}
q_new:=1;
for i:=1 to k do
    begin
    q_new:=q_new*q;
    end;
if q=1 then summa_k:=k*b1;
if q<>1 then summa_k:=(b1*(q_new-1))/(q-1);
writeln ('summa ',k,' pervyx elementov ravna ',summa_k:0:4);
readln;
end.
если можете поднимите пожалуйста мне репутацию....спкасибо...

From Stilet: А код оформить читабельно Пушкин должен?

Последний раз редактировалось Stilet; 16.04.2009 в 08:48.
Allen Iverson вне форума Ответить с цитированием
Старый 16.04.2009, 09:47   #3
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Цитата:
Сообщение от Knife Посмотреть сообщение
3. Найдите n-й член геометрической последовательности. Найти сумму первых k членов геометрической прогрессии. Дано: b1,q,n,k
b[n]=b[1]*q^(n-1);

Код:
sum:=b1;
temp:=b1;
for i:=2 to k do
 begin
  temp:=temp*q
  sum:=sum+temp;
 end;
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 17.04.2009, 23:21   #4
Knife
 
Регистрация: 03.03.2009
Сообщений: 8
По умолчанию

а как повысить рейтинг, я шкалы не вижу!))
Knife вне форума Ответить с цитированием
Старый 18.04.2009, 23:37   #5
Allen Iverson
Пользователь
 
Аватар для Allen Iverson
 
Регистрация: 15.04.2009
Сообщений: 28
По умолчанию

>>>а как повысить рейтинг, я шкалы не вижу!))

незнаю...мне уже как то уменьшили...
Allen Iverson вне форума Ответить с цитированием
Старый 19.04.2009, 02:50   #6
alex_fcsm
Участник клуба
 
Аватар для alex_fcsm
 
Регистрация: 10.11.2008
Сообщений: 1,502
По умолчанию

Цитата:
Сообщение от Allen Iverson Посмотреть сообщение
>>>а как повысить рейтинг, я шкалы не вижу!))

незнаю...мне уже как то уменьшили...
Под Вашей аватаркой есть "весы" - оставить отзыв. Это и есть изменение рейтинга.
P.S. Конечно Ваше дело, но не стоит выпрашивать отзывы(ИМХО). Здесь на форуме люди собрались не рейтингами мериться...
Нормальное состояние техники - нерабочее, все остальное частный случай.
alex_fcsm вне форума Ответить с цитированием
Старый 19.04.2009, 12:29   #7
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Задачи не на массивы и совсем не тривиальные. Они встречались на школьных олимпиадах по информатике.
Задачу 2 можно было решить и простым перебором, но это же так медленно работает .

Задача 1:
Код:
program friend;
var
	i,j,sqrc,sum1,sum2:longint;
	fsqrc:real;
begin
	assign(output,'output.txt');
	rewrite(output);
	for i := 4 to 1000000 do begin
		fsqrc:=sqrt(i);
		sqrc:=trunc(fsqrc);
		sum1:=0;
		sum2:=0;
		for j:= 2 to sqrc do
			if i mod j = 0 then
				if j=fsqrc then
					inc(sum1,j)
				else
					inc(sum1 , j + i div j);
		inc(sum1);
		if sum1=1 then continue;
		if sum1<=i then continue;
		fsqrc:=sqrt(sum1);
		sqrc:=trunc(fsqrc);
		for j:= 2 to sqrc do
			if sum1 mod j = 0 then
				if j=fsqrc then
					inc(sum2,j)
				else
					inc(sum2 , j + sum1 div j);
		inc(sum2);
		if (i<>sum1)and(i=sum2) then
			writeln('(',i,' , ',sum1,'),');
	end;
	close(output);
end.
Но это работает долго при больших N. Куда как быстрее
Код:
program friendly;
const
	f:array[1..42,1..2]of longint = (
(220 , 284),
(1184 , 1210),
(2620 , 2924),
(5020 , 5564),
(6232 , 6368),
(10744 , 10856),
(12285 , 14595),
(17296 , 18416),
(63020 , 76084),
(66928 , 66992),
(67095 , 71145),
(69615 , 87633),
(79750 , 88730),
(100485 , 124155),
(122265 , 139815),
(122368 , 123152),
(141664 , 153176),
(142310 , 168730),
(171856 , 176336),
(176272 , 180848),
(185368 , 203432),
(196724 , 202444),
(280540 , 365084),
(308620 , 389924),
(319550 , 430402),
(356408 , 399592),
(437456 , 455344),
(469028 , 486178),
(503056 , 514736),
(522405 , 525915),
(600392 , 669688),
(609928 , 686072),
(624184 , 691256),
(635624 , 712216),
(643336 , 652664),
(667964 , 783556),
(726104 , 796696),
(802725 , 863835),
(879712 , 901424),
(898216 , 980984),
(947835 , 1125765),
(998104 , 1043096));
var
	m,n,i:longint;
	ok:boolean;
begin
	ok:=false;
	assign(input,'friendly.in');
	assign(output,'friendly.out');
	reset(input);
	rewrite(output);
	read(m,n);
	for i := 1 to 42 do
		if (f[i,1] >= m) and (f[i,2] <= n) then begin
			ok:=true;
			writeln(f[i,1],' ',f[i,2]);
		end;
	if not ok then write('Absent');
	close(input);
	close(output);
end.

Последний раз редактировалось megachuhancer; 19.04.2009 в 12:34.
megachuhancer вне форума Ответить с цитированием
Старый 19.04.2009, 12:30   #8
megachuhancer
Форумчанин
 
Регистрация: 16.04.2009
Сообщений: 247
По умолчанию

Жалко в один пост не влез.
Задача 2:
Код:
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
int n ;
double tx , ty;
double rmax;
pair< double , pair< double , double > > a[50000];
vector < pair< double,pair< double , double > > > c;

//----------------------------------------

double check_turn(double p0x , double p0y , double p1x , double p1y , double p2x , double p2y){
   return (p1x - p0x)*(p2y - p0y) - (p2x - p0x)*(p1y - p0y);
}

//----------------------------------------

void build_conhull(){
   //находим левую нижнюю точку
   bool flag = false;
   int tn = 0;
   for(int i = 1; i < n ; i++){
      if(a[i].second.first < a[tn].second.first) tn = i;
      if(a[i].second.first == a[tn].second.first && a[i].second.second < a[tn].second.second) tn = i;
   }
   //смещаем систему координат так, чтобы левая нижняя точка оказалась в центре
   tx = a[tn].second.first;
   ty = a[tn].second.second;
   for(int i = 0; i < n; i++){
      a[i].second.first -= tx;
      a[i].second.second -= ty;
   }
   //находим полярные углы в новой системе координат
   for(int i = 0; i < n; i++)
      a[i].first = atan2((double)a[i].second.first,(double)a[i].second.second);   
   //сортируем по полярному углу
   sort(&a[0],&a[n]);
   //левая нижняя точка заведомо принадлежит выпуклой оболочке   
   for(int i = 0 ; i < n ; i++)if(a[i].second.first == 0 && a[i].second.second == 0){
      c.push_back(a[i]);
      tn = i;
   }
   //строим выпуклую оболочку
   int i = 0;
   if(i==tn)
	   i++;
   c.push_back(a[i]);
   i++;
   if(n < 3) return;
   while(i < n){
         if(i==tn) 
            i++;
         vector< pair< double,pair< double,double > > >::iterator av , bv;
         pair< double,pair< double,double > > cv;
         av = c.end() - 2;
         bv = c.end() - 1;
         cv = a[i == n ? tn : i];
		 double check = check_turn(av->second.first,av->second.second,bv->second.first,bv->second.second,cv.second.first,cv.second.second);
         if(bv->first>=0){
            if(check < 0){
               c.push_back(a[i]);
               i++;
            }
			else if(check == 0){
				i++;
				while(a[i].first == a[i - 1].first && i < n)i++;
				i--;
				c.push_back(a[i]);
                i++;
			}
            else
               if(c.size() > 1) c.pop_back() ;
         }
         else{
             if(check > 0){
               c.push_back(a[i]);
               i++;
            }
			else if(check == 0){
			   i++;
			   while(a[i].first == a[i - 1].first && i < n)i++;
			   i--;
			   c.push_back(a[i]);
               i++;
			}
            else
               if(c.size() > 1) c.pop_back();
         }
         
      
   }
}

//----------------------------------------

void find_points(){
   double max = 0 , dist;
   vector< pair< double,pair< double,double > > >::iterator i = c.begin();
   vector< pair< double,pair< double,double > > >::iterator j = i + 1;
   double lmax = 0;
   while(i != c.end() - 1 || j != c.end() - 1){ 
      dist = sqrt(pow((double)j->second.first - i->second.first,2)+pow((double)j->second.second - i->second.second,2));
      if(dist > max)
         max = dist;
      if(dist > lmax) lmax = dist;
      if(dist < lmax){i++; j--; lmax = 0; continue;}
      if(j != c.end() - 1)j++;else i++;
   }
   rmax = max;
}

//----------------------------------------

int main(){
   freopen("input.txt","r",stdin);
   freopen("output.txt","w",stdout);
   scanf(" %d",&n);
   for(int i = 0; i < n; i++)scanf(" %lf %lf",&a[i].second.first,&a[i].second.second);
   build_conhull();
   find_points();
   printf("%.8lf" , rmax);
   return 0;
}
megachuhancer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Pascal] Задачи на матрицы. Прошу подсказки. Knife Помощь студентам 2 14.04.2009 00:17
Прошу помощи в решении задачи на языке Free Pascal Refenement Помощь студентам 7 21.12.2008 15:27