Только начался первый в моей жизни семестр... но вот по программированию мне не очень легко дается... точнее совсем никак не дается... на лекциях одно.. а лаборант уже дает задачи совсем другие...
мне надо решить две задачи до завтра или он на меня подаст справку в деканат. Задачи то простые, но я пока не очень умею это все писать. Помогите плиз, а то проблем получу с начала первого курса
Задачи такие...
Ввести натуральное N. Определить можно ли представить N! фактореал в виде произведения 3 последовательных чисел ( k*(k+1)*(k+2) ).
Расположить элементы матрицы M[5][5] так чтобы на побочной диагонали были бы минимальные элементы столбцов.
помогите с Си, надо решить две задачи...иначе меня выгонят..
Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill
Первая решается вот так:
#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;
}
А над второй думать сейчас лень...
#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;
}
А над второй думать сейчас лень...
Маленькое замечание 
//Проверка
int k;
for (k=1; (k*(k+1)*(k+2)) < fN; k++) {
;
}
if ((k*(k+1)*(k+2)) == fN) {Ok = true;}
Правда факториал 13 уже больше чем 2^32.

//Проверка
int k;
for (k=1; (k*(k+1)*(k+2)) < fN; k++) {
;
}
if ((k*(k+1)*(k+2)) == fN) {Ok = true;}
Правда факториал 13 уже больше чем 2^32.
Думаю, что для "первого ... семестра ..." это не так принципиально, ну а вообще согласен, лучше использовать не int, а что-то покрупнее, например float. К тому же, я это писал после 11 часов работы для того,
чтобы хоть немного отвлечься, так что думать тогда мне было не только тяжело, но и противопоказано :lol:
чтобы хоть немного отвлечься, так что думать тогда мне было не только тяжело, но и противопоказано :lol:
-
- Сообщения: 2
- Зарегистрирован: 10 окт 2004, 20:03
- Откуда: Moscow, Russia
- Контактная информация:
небольшая поправка: N должен быть РАВЕН 3, иначе N будет представлено в виде четырёх или более. что противоречит условиюAndragen писал(а):Предлагаю следующую формулу исходя из определения фактоиала
Фактоиал числа N есть произведение всех чисел от 1 до N и чтобы в это произведение можно было представить как произведение трёх последовательных чисел то N должен быть >=3

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

извиняюсь но выше был тоже я 
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;
}
}

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;
}
}
Это неочевидно, поэтому далее дожно следовать строгое доказательство.условие будет верно для N от 3 до 6 дальше расходятся
Да и вопрос был по програмированию, а не по математике, что несколько отличается.