помогите с Си, надо решить две задачи...иначе меня выгонят..

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, dr.Jekill, MOTOCoder, Medved

some1else
Сообщения: 1
Зарегистрирован: 20 сен 2004, 20:39
Контактная информация:

20 сен 2004, 20:57

Только начался первый в моей жизни семестр... но вот по программированию мне не очень легко дается... точнее совсем никак не дается... на лекциях одно.. а лаборант уже дает задачи совсем другие...
мне надо решить две задачи до завтра или он на меня подаст справку в деканат. Задачи то простые, но я пока не очень умею это все писать. Помогите плиз, а то проблем получу с начала первого курса

Задачи такие...
Ввести натуральное N. Определить можно ли представить N! фактореал в виде произведения 3 последовательных чисел ( k*(k+1)*(k+2) ).

Расположить элементы матрицы M[5][5] так чтобы на побочной диагонали были бы минимальные элементы столбцов.
Bikutoru
Сообщения: 16
Зарегистрирован: 13 авг 2004, 15:56

25 сен 2004, 22:06

Первая решается вот так:

#include <iosteam.h>

int fact(int N) //Расчет факториала N
{
int result=1;

for (int i=2; i<=N; i++)
result=result*i;

return result;
}

void main()
{
int fN;
bool Ok;

cout<<"Введите N ";
cin>>N;

fN=fact(N); //Расчет факториала
Ok=false;

for (int k=1; k<=N-2; k++)
if (k*(k+1)*(k+2)==fN) //Проверка соответствия требуемому виду
{
Ok=true; //Установка флага

break;
}

if (Ok) //Вывод результата в зависимости от значения флага
cout<<"Можно"<<endl;
else
cout<<"Нельзя"<<endl;

}

А над второй думать сейчас лень...
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

26 сен 2004, 01:03

Маленькое замечание :)
//Проверка
int k;
for (k=1; (k*(k+1)*(k+2)) < fN; k++) {
;
}
if ((k*(k+1)*(k+2)) == fN) {Ok = true;}

Правда факториал 13 уже больше чем 2^32.
Bikutoru
Сообщения: 16
Зарегистрирован: 13 авг 2004, 15:56

28 сен 2004, 08:21

Думаю, что для "первого ... семестра ..." это не так принципиально, ну а вообще согласен, лучше использовать не int, а что-то покрупнее, например float. К тому же, я это писал после 11 часов работы для того,
чтобы хоть немного отвлечься, так что думать тогда мне было не только тяжело, но и противопоказано :lol:
deadem
Сообщения: 2
Зарегистрирован: 10 окт 2004, 20:03
Откуда: Moscow, Russia
Контактная информация:

10 окт 2004, 20:07

Andragen писал(а):Предлагаю следующую формулу исходя из определения фактоиала :)
Фактоиал числа N есть произведение всех чисел от 1 до N и чтобы в это произведение можно было представить как произведение трёх последовательных чисел то N должен быть >=3
небольшая поправка: N должен быть РАВЕН 3, иначе N будет представлено в виде четырёх или более. что противоречит условию ;)

ps. а что такое "побочная диагональ"? ;)
Andragen
Сообщения: 4
Зарегистрирован: 10 окт 2004, 16:12
Контактная информация:

10 окт 2004, 20:43

извиняюсь но выше был тоже я :)
void min_on_diag(int *mat,int n){//mat указатель на матрицу n размерность матрицы
int min,ind,tmp;
if(n<=0)return;

for(int i=0;i<n;i++){
min=mat[0];
ind=0;
for(int j=1;j<n;j++){
min>mat[j]?min=mat[j],ind=j:;
}
tmp=mat[n-1-i][n-1-i];
mat[n-1-i][n-1-i]=min;
mat[ind]=tmp;
}
}
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

10 окт 2004, 22:50

условие будет верно для N от 3 до 6 дальше расходятся
Это неочевидно, поэтому далее дожно следовать строгое доказательство.

Да и вопрос был по програмированию, а не по математике, что несколько отличается.
Ответить