• XSS.stack #1 – первый литературный журнал от юзеров форума

Алгоритмы

AKella

(L2) cache
Пользователь
Регистрация
30.12.2004
Сообщения
410
Реакции
15
[mod][Great:] Тут задаем вопросы по составлению алгоритмов для прогамм. Что-то вроде "как посчитать простые числа" или в этом роде. Но учтите, что простые вопросы вида "сложить 2 и 3" не принимаются.[/mod]

Короч на веб-хак чувак какой-то попросил помочь решить задачи. Я решил выложить их сюда.
1)Дан линейный массви натуральных чисел. Какая цифра наиболее часто встречается в записи этих чисел? Если таких цифр несколько, напечатать каждую

2)Дано натуральное число n Заполнить квадратную матрицу размерности n*n последовательными натуральными числами, начиная с 1, размащая их против часовой стрелки по периметру всех вложенных квадратов, начиная с левого верхнего угла.

3)Даны N целых чисел Х1, Х2, ... , Xn. Составте программу, которая расставит между ними знаки "+" и "-" так, чтобы значение получившегося выражения было равно заланному целому S.
2<n<24, 0<X<50 000 000, -1 000 000 000<S<1 000 000 000

4)В декартовой системе координат на плоскости заданы координаты вершин треугольника (x1,y1),(x2,y2),(x3,y3) и еще одна точка (x0,y0). Составте программу, которая будет определять, принадлежит ли эта точка треугольнику.
 
Вот решение 4 задачи:
Код:
#include <iostream.h>

int main()
{
cout<<"x1=";
cin>>x1;
cout<<"x2=";
cin>>x2;
cout<<"x3=";
cin>>x3;
cout<<"x0=";
cin>>x0;

 if ((x1 < x3) && (y2 > y1) && (y2 > y3)) 
 {
   if (((x0 >= x1) && (y0 >= y1)) && ((x0 <= x2) && (y0 <= y2)) && ((x0 <= x3) && (y0 >= y3)))
     cout << "Точка принадлежит треугольнику. \n";
   else
     cout << "Точка вне треугольника. \n";
 }
 else
   cout << "Координаты треугольника заданны неправильно. \n";

 return 0;
}
Помогите с остальными...
 
AKella Программа не полная и кажется, может быть я и ошибаюсь, но теорема о существовании треугольника, или как там она называется выглядит посложнее... у нас когда-то была такая задача в школе на паскале еще писали, так у нас проверка на существование треугольника зашкаливала за экран...

Программа не полная, потому что не вводишь игрики, но это не так страшно...
Добавлено в [time]1136663003[/time]
Первая задача
Вобщем вот, не знаю, можно ли так или нет... т.е. я задаю не вектор (одномерный массив), а несколько другое... Вобщем сами решайте :о) просто иного ничего в голову не пришло :о)
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define n 5

int main(){
	clrscr();
	int arr[n][2];
	randomize();
	printf("Array --> \n");
	for(int i = 0; i <= n; i++){
  arr[i][0] = random(10);
  arr[i][1] = 0;
  for(int y = 0; y <= i; y++)
  	if(arr[i][0] == arr[y][0])arr[i][1]++;
  printf("%d ", arr[i][0]);
	}
	int max = arr[0][1];
	for(i = 0; i <= n; i++){
  if(max < arr[i][1])max = arr[i][1];
	}
	printf("\n Often --> \n");
	for(i = 0; i <= n; i++){
  if(max == arr[i][1])printf("%d ", arr[i][0]);
	}
	getch();
	return 0;
}
 
Вот тут еще немного посидел и решил вторую задачу :о).
Код:
#include <stdio.h>
#include <conio.h>

#define n 5
	int arr[n][n]; // сам массив (сделан статически чисто из прихоти, чтобы не обнулять его :-) у меня компилятор чего-то заключило и он не хотел его обнулять)

int main(){
	clrscr();
	int xStart = 0;
	int yStart = 0;
	int xEnd = n;
	int yEnd = n;
	int number = 1;
	while((xStart <= xEnd)){
  for(int i = yStart; i < yEnd; i++){
  	arr[xStart][i] = number;
  	number++;
  }
  xStart++;
  for(i = xStart; i < xEnd; i++){
  	arr[i][yEnd - 1] = number;
  	number++;
  }
  yEnd--;
  for(i = yEnd - 1; i >= yStart; i--){
  	arr[xEnd - 1][i] = number;
  	number++;
  }
  xEnd--;
  for(i = xEnd - 1; i >= xStart; i--){
  	arr[i][yStart] = number;
  	number++;
  }
  yStart++;
	} //end while
// вывод массива
	for(int j = 0; j < n; j++){
  for(int i = 0; i < n; i++)
  	printf("%d     ", arr[i][j]);
  printf("\n");
	}
	getch();
	clrscr();
	return 0;
}

Ну а насчет третьей не знаю... пока что ничего в голову не лезет... Если вдруг что придумаю, то напишу
 
Вот еще задачу нашел. Вроде легкая. Но я че-то не могу понять, как тут m изменяется (в каких пределах). Кто решит, просьба выложить код. Заранее благодарен.
 

Вложения

  • 4.jpg
    4.jpg
    81.9 КБ · Просмотры: 512
Первая задача
Вобщем вот, не знаю, можно ли так или нет... т.е. я задаю не вектор (одномерный массив), а несколько другое... Вобщем сами решайте :о) просто иного ничего в голову не пришло :о)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define n 5

int main(){
clrscr();
int arr[n][2];
randomize();
printf("Array --> \n");
for(int i = 0; i <= n; i++){
arr[0] = random(10);
arr[1] = 0;
for(int y = 0; y <= i; y++)
  if(arr[0] == arr[y][0])arr[1]++;
printf("%d ", arr[0]);
}
int max = arr[0][1];
for(i = 0; i <= n; i++){
if(max < arr[1])max = arr[1];
}
printf("\n Often --> \n");
for(i = 0; i <= n; i++){
if(max == arr[1])printf("%d ", arr[0]);
}
getch();
return 0;
}

Ты решил задачу для однозначных чисел. А если числа будут не однозначные? Тогда твоя программа не работает...
Проблема в чем: ты берешь полностью число, надо цифру. Вот например если в твоей программе задать числа: 21 21 34 33 5, она выдаст ответ 21, хотя надо 3, т.к цифра 3 чаще встречается.
 
Вот моё решение Задачи 2(Корни)
Код:
#include <iostream.h>
#include <conio.h>
#include <math.h>

void main(void)

{
float n,m,i,k,s,km;
clrscr();
cout<<"n=";
cin>>n;
cout<<"m=";
cin>>m;
km=1;
for(i=1;i<=m;i++)
{
 k=pow(1+(n+i-1),1/(2*i));
 km*=k;
}
s=sqrt(km);
cout<<"s="<<s;
getch();
}
Задача вроде решена правильно, но ответ выходит почему-то другой. У меня получается 36.255753, тогда как в условии при заданных n=41 m=23 получается 6.480739 . Посмотрите, кому не лень, почему так получается, и вылаживайте свое решение...
P.S. Задача с треугольником решена не правильно, а ее решение нужно и мне... на 10 число... Так что помогите, кто может. Заранее благодарен.
 
AKella
Ты решил задачу для однозначных чисел. А если числа будут не однозначные? Тогда твоя программа не работает...
Проблема в чем: ты берешь полностью число, надо цифру. Вот например если в твоей программе задать числа: 21 21 34 33 5, она выдаст ответ 21, хотя надо 3, т.к цифра 3 чаще встречается.
То я не правельно прочитал условие :) я думал, что именно числа надо искать, а не цифры... :) то я лажанулся... ща еще посмотрю насчет тех задач, что ты решил...

А насчет треугольника... найди теорему о существовании треугольника... это вроде бы геометрия за 9-ый или 10-ый класс, я точно не помню... если найдешь и выкинишь сюда, то я тебе напишу программу... просто я не знаю ни как звучит теорема, ни как она называется...
Добавлено в [time]1136799674[/time]
Код:
#include <iostream.h>
#include <conio.h>
#include <math.h>

void main(void){
	float n,m,km;
	clrscr();
	cout << "n=";
	cin >> n;
	cout << "m=";
	cin >> m;
	km = 1 + n;
	while(m >= 2)
  km = km + sqrt(1 + n + --m)
	km = sqrt(km);
	cout << "km=" <<km;
	getch();
}

Вот так вот вроде де бы должно быть, но проверь, у меня тут не компилятора :-( я в голове компилил...
А ты написал код, у которого формула несколько другая... тут надо начинать считать с конца уравнения, а ты начинал с начала уравнения... и потом, ты еще там умножал на какое-то k, которое определено, но никакого значения не присовено... вобщем на какой-то мусор умножал :)
 
Твоя программа тоже не правильно считает, в результате получается 14 с копейками...
и потом, ты еще там умножал на какое-то k, которое определено, но никакого значения не присовено... вобщем на какой-то мусор умножал :)
k Это каждая часть корня. Когда i=1 k=sqrt(1+n). Потом это число сохраняется в km. при i=2 k=pow((1+2+n),1/2*2) потом это выражение перемножается с km. И так далее пока i==m.
 
Код:
#include <stdio.h>
#include <conio.h>
#include <math.h>

float koren(int m, int n, int k){
	float sum = 0;
	if(k == m)return (1 + n + --m);
	else
  sum = sum + 1 + (n + (k - 1)) * sqrt(koren(m, n, ++k));
	return sum;
}

void main(void){
	int n,m;
	float km;
	printf("n --> ");
	scanf("%d", &n);
	printf("m --> ");
	scanf("%d", &m);
	km = koren(m, n, 1);
	km = sqrt(km);
	printf("km --> %f", km);
	getch();
}
AKella, Слушай, тебя перевернули с ответом, он не правельный !!! я только что расчитывал пять шагов, с моей программой, ну хотя бы этой, он точно совпадает... кучу времени на это убил... расчитай ходы когда n = 1, а m = {1, 2, 3, 4, 5}. Все тут работает !!! либо я уже ничего не соображаю, и каким-то невероятным образом у меня вышло пять неправельных ответов, которые еще и сошлись с вычислениями компа. (Я вычислял по той, формуле, что ты написал, т.е. по тому рисунку, или как его там...)
З.Ы. Ща буду придумывать с первой задачей

Добавлено в [time]1136828784[/time]
Воть тебе первая задача :) понтовая до ужаса :) потому и будем вычислять количество цифр по прЫкольному :) тобишь рекурентным способом :) конечно же мона было с помощью цикла, но это не наши методы :-D
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define n 5

void ost(int num, int numbers[]){
	if(num < 10)numbers[num]++;
	else {
  numbers[num % 10]++;
  ost(int(num / 10), numbers);
	}
}

int main(){
	clrscr();
	int arr[n];
	int numbers[10];
	for(int y = 0; y < 10; y++)
  numbers[y] = 0;
	randomize();
	printf("Array --> \n");
	for(int i = 0; i <= n; i++){
  arr[i] = random(20);
  ost(arr[i], numbers);
  printf("%d ", arr[i]);
	}
	int max = numbers[0];
	for(i = 0; i < 10; i++){
  if(max < numbers[i])max = numbers[i];
	}
	printf("\n Often numbers --> \n");
	for(i = 0; i < 10; i++){
  if(max == numbers[i])printf("4islo %d --> %d raz", i, numbers[i]);
	}
	getch();
	return 0;
}
Добавлено --> AKella При встрече, бушь пиво должен :) :-D
 
Это не теорема а просто условие.

Длина каждой стороны меньше суммы двух других.
Ну это само собой. Только не о том имелось в виду. Он говорило том, как можно задать треугольник...
 
Видимо я что-то недоперепонял :bang:

Задать треугольник можно
1) Тремя точками А(х1,у1) В(х2,у2) С(х3,у3)
2) Длинами трех сторон (x,y,z) - задается свободный жесткий треугольник, не зависящий от системы отсчета.

Или вы просто имеете в виду как проверить корректность координат?
 
свободный жесткий треугольник
В смысле плоский :D

Или вы просто имеете в виду как проверить корректность координат?
Мы просто имели в виду как задать треугольник, чтоб потом проверить, лежит ли четвертая точка внутри его.
 
AKella А задачи то где :) что-то я их не вижу :)

ДАвай решать все что хочешь :) мне уже все пофиг :) я сегодня последний экзамен сдал и закрылся с этой гребанной сессией :) ща опять вино пью :) и ниипет :D :D :D Сейчас как раз самое оно решать что :) у меня код очень удивительно работать :D не понятно как, но зато будет ;-) :D
 
Эскиз почему-то не соединился. Ладно вот первая.
Определим правильное скобочное вырожение следующим образом:
- пустое выражение правильное.
- если Е - правильное скобочное выражение, то (Е), [Е] {Е} <Е> - тоже правильные, причем () {} [] <> - -все возможные типы скобок,
- если E и F - правильные скобочные выражения, то EF - тоже правильное.
- других правильных скобочных вырожений нет.
Пример правильного: (), [<>]
Пример неправильного: (, ([)]
Необходимо определить, является ли правильным выражение, которое находится в data.txt
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх