PDA

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



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

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

Расположить элементы матрицы M[5][5] так чтобы на побочной диагонали были бы минимальные элементы столбцов.

Bikutoru
25.09.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
26.09.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
28.09.2004, 08:21
Думаю, что для "первого ... семестра ..." это не так принципиально, ну а вообще согласен, лучше использовать не int, а что-то покрупнее, например float. К тому же, я это писал после 11 часов работы для того,
чтобы хоть немного отвлечься, так что думать тогда мне было не только тяжело, но и противопоказано :lol:

Anonymous
10.10.2004, 16:09
Предлагаю следующую формулу исходя из определения фактоиала :)
Фактоиал числа N есть произведение всех чисел от 1 до N и чтобы в это произведение можно было представить как произведение трёх последовательных чисел то N должен быть >=3
Значит и фактоиал вычислять не нужно :) и хватит простого int :)
вот функция
int ifmojno(int N){
return N>=3?1:0;
}
//фунция возращает 1 если можно представить и 0 иначе
Учитесь брать не все задачи в лоб :) Как говриться "умный в гору не пойдёт :)умный гору подорвёт :)"

deadem
10.10.2004, 20:07
Предлагаю следующую формулу исходя из определения фактоиала :)
Фактоиал числа N есть произведение всех чисел от 1 до N и чтобы в это произведение можно было представить как произведение трёх последовательных чисел то N должен быть >=3


небольшая поправка: N должен быть РАВЕН 3, иначе N будет представлено в виде четырёх или более. что противоречит условию ;)

ps. а что такое "побочная диагональ"? ;)

Anonymous
10.10.2004, 20:28
:) извентиляюсь ошибся малёхо :) условие будет верно для N от 3 до 6 дальше расходятся :)
фунию переделал
int ifmojno(int N){
return (N>=3&&N<=6)?1:0;
}

Andragen
10.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][i];
ind=0;
for(int j=1;j<n;j++){
min>mat[j][i]?min=mat[j][i],ind=j:;
}
tmp=mat[n-1-i][n-1-i];
mat[n-1-i][n-1-i]=min;
mat[ind][i]=tmp;
}
}

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

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

Anonymous
11.10.2004, 14:22
условие будет верно для N от 3 до 6 дальше расходятся


Не факт. Вообще откуда такой вывод?

Bikutoru
13.10.2004, 08:30
Лирическое отступление:

10!=328800 (10>3 -> Можно)
k=147: k*(k+1)*(k+2)=147*148*149=3241644<10!
k=148: k*(k+1)*(k+2)=148*149*150=3307800>10!

... Если условие верно от 3 до 6, то как быть с числами от 7 и выше?.. Ведь 7!=5040, а это даже в signed int поместится... нужно либо искать новые условия, либо писать общий случай (но замечание от 3 до 6 безусловно интересное :-) )