Факториал заданного числа вычислить
Как вычислить Факториал заданного числа
С++ Builder 6
Компиляция и сборка под Windows 10
Интересно что Рекурсия вычисляет правильно до 30! числа
а может и дальше
А циклы начинают врать с 14!
Исходник здесь
=
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//----------цикл for-----------------------------------------------------------------
float factorial(int N)
{
if(N==0) return 1;
if(N==1) return 1;
float F = 1;
for(int i=1; i <= N; ++i)
{
F = F*i;
}
return F; // Возвращаем ответ
}
//----------цикл while-------------------------------------
float factorial1(int N)
{
if(N==0) return 1;
if(N==1) return 1;
float F = 1; int x = 1;
while( x <= N)
{
F = F*x;
x++;
}
return F; // Возвращаем ответ
}
//-----------рекурсия--------------------------------
float factorial2(int N)
{
if(N==0) return 1;
if(N==1) return 1;
return N*factorial2(N-1);
}
//-----------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
S = Image1->Height-10; // нуливая точка для построения графика нижний левый угол
M = 20; //маштаб множитель для координаты Х чтоб видно было
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//---------СОЗДАЕМ points для построения графика на шесть точек-----------------------------------------------------
TPoint points[CountPoint];
points[0].x = 0 ;
points[0].y = S;
//---------------------цвет и толщина лин для осей----------------------------------------
Image1->Canvas->Pen->Color=clBlack;
Image1->Canvas->Pen->Width=2;
//----------------------ось игрек строим-----------------------------------------
Image1->Canvas->MoveTo(1,S) ;
Image1->Canvas->LineTo(1,0) ;
//--------------------ось икс строим----------------------------------------------------
Image1->Canvas->MoveTo(1,S) ;
Image1->Canvas->LineTo(Image1->Width ,S) ;
//----------------------засечки на оси игрек через 10 точек длина засечки 5 точек------------------------------------------------
for(int z=1; z<S; z++) {
Image1->Canvas->MoveTo(1,S-z*10) ;
Image1->Canvas->LineTo(5,S-z*10) ;
}
//-------------очищаем -ListBox1---------------------------------------------------
ListBox1->Items->Clear();
//--------выбираем какая функ будет работать-----
//--------имя функции - ее адрес, присваеваем указателю; цвет графика------------------------------------------------
if(RadioButton1->Checked==true ) {pF = factorial; Image1->Canvas->Pen->Color=clRed; }
if(RadioButton2->Checked==true ) {pF = factorial2; Image1->Canvas->Pen->Color=clBlue;}
if(RadioButton3->Checked==true ) {pF = factorial1; Image1->Canvas->Pen->Color=clGreen; }
N = StrToInt( Edit2->Text) ;// в водим число
AnsiString valueFakt = "" ;
//-----------начинаем цикл подсчета факториала--------------------------------------------------
for(int i=1; i <= N; i++){
//------------заполняем points значениями для первых шести точек-------------------------------------------------
if( i < CountPoint ){ points[i].x = i * M ; points[i].y = S - pF(i); }
valueFakt = FloatToStr( pF(i) ); //вычисляем факториал; значен факториала переводим в строку
ListBox1->Items->Add(IntToStr( i) + "-----" + valueFakt);//строку добав в ListBox1
}
//--------------строим график по шести точкам---------------------------------
//-------шестую точку не видно но она есть выходит за размер Image1 720 пиксел--------------------------------------------------------
Image1->Canvas->Polyline(points ,CountPoint-1);
//--------------выводим текст номера точек ----------------------------------------------------------
Image1->Canvas->TextOutA(points[1].x, points[1].y,"1" ) ;
Image1->Canvas->TextOutA(points[2].x, points[2].y,"2" ) ;
Image1->Canvas->TextOutA(points[3].x, points[3].y,"3" ) ;
Image1->Canvas->TextOutA(points[4].x, points[4].y,"4" ) ;
Image1->Canvas->TextOutA(points[5].x, points[5].y,"5" ) ;
Image1->Canvas->TextOutA(points[6].x, points[6].y,"6" ) ;
}
//------------В Edit2 только цифры и забой---------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{
if(Key >= '0' && Key <= '9' || Key == VK_BACK ) return;
Key = 0;
}
//---------Очистка ListBox1 и стираем Canvas------------------------------------------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
ListBox1->Items->Clear();
Image1->Canvas->Brush->Color = clWhite;
Image1->Canvas->FillRect(Image1->Canvas->ClipRect ) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton3Click(TObject *Sender)
{
ListBox1->Items->Clear();
Image1->Canvas->Brush->Color = clWhite;
Image1->Canvas->FillRect(Image1->Canvas->ClipRect ) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)
{
ListBox1->Items->Clear();
Image1->Canvas->Brush->Color = clWhite;
Image1->Canvas->FillRect(Image1->Canvas->ClipRect ) ;
}
//---------значения в ListBox1 выделить в ListBox2------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
ListBox2->SetFocus();
ListBox2->ItemIndex= ListBox1->ItemIndex ;
}
//---------------------------------------------------------------------------
=
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//------Функции объявляем глобально в не класса TForm1------------------
//------для того чтобы укахателю pF можно было передать адрес выбраной функции---------------------------------------------------------------
float factorial2(int N);
float factorial(int N);
float factorial1(int N);
//-------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TEdit *Edit2;
TRadioGroup *RadioGroup1;
TRadioButton *RadioButton1;
TRadioButton *RadioButton2;
TListBox *ListBox1;
TImage *Image1;
TRadioButton *RadioButton3;
TLabel *Label1;
TListBox *ListBox2;
TEdit *Edit1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Edit2KeyPress(TObject *Sender, char &Key);
void __fastcall RadioButton1Click(TObject *Sender);
void __fastcall RadioButton3Click(TObject *Sender);
void __fastcall RadioButton2Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall ListBox1Click(TObject *Sender);
private: // User declarations
public: // User declarations
long int N ; // фактоиал числа
long int S ; // начальная точка для построения графика
long int M ; // множитель координаты х
static const int CountPoint =7 ; //количество точек для построен графика
float (*pF)(int ); // указатель на функцию
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
=
=
|