Естествено число - римски цифри, палиндром

Често се бъркат понятията число и цифра. Всяко число е съставено от цифри, обратното твърдение е невярно. В десетичната позиционна бройна система цифрите са 0,1,2,3,4,5,6,7,8 и 9, но в двоичната бройна система цифрите са само 2 - 0 и 1. Най-разпространената непозиционна бройна система е римската. Всяка отделна цифра в нея не променя стойността си в зависимост от мястото в числото. Броят различните цифри, използвани в една позиционна система, се нарича основа на разглежданата бройна система Всяко число в една бройна система се представя чрез тези цифри. Изброените цифри са също и числа в тази бройна система. Понятието n-цифрено число се свързва с броя цифри в същото число.

Съдържание

въвеждане на естествено число цифра по цифра
брой цифри на всички естествени числа от даден интервал
естествено число палиндром - рекурсия
огледално число с нечетни цифри
число с римски цифри
цифри в дълго число

въвеждане на естествено число цифра по цифра

Ще разгледаме паралелно два алгоритъма: за въвеждане на естествено число чрез последователно въвеждане на неговите цифри отляво-надясно и алгоритъм за извеждане поотделно на всички цифри на въведено естествено число.

А. Алгоритъм и програма за въвеждане на естествено число цифра по цифра.
Началната цифра на естествено число е от интервала [1..9], т.е. 0 не може да бъде първа цифра в числото. Последователно ще се въвеждат всички цифри на естественото число.
Инициализираме въвежданото число със стойност 0. На всяка стъпка от алгоритъма полученото ново естествено число се умножава по 10 и към това произведение се прибавя последната въведена цифра.
Алгоритъмът продължава своята работа, докато се изпълняват едновременно и двете условия: броят на въведените цифри е <10 и потребителят желае да въвежда още цифри.

Б. Алгоритъм за извеждане на всички цифри на естествено число.
За определяне цифрите в естествено число се използва делител със стойност 10, който е и основа на ползваната бройна система. Тук се ползват два оператора в езика:
1) % - остатък от целочислено деление и
2) / - в случая е целочислено деление.
Пример:
27 &10 дава резултат 7, а
27 / 10 - дава резултат 2.
На всяка стъпка от алгоритъма се извежда най-дясната цифра на числото, а самото число се дели на 10 (основата на бройната система). Алгоритъмът продължава своята работа, докато числото е >0.

   Следващата примерна програма дава решена задача за въвеждане на естествено число:

#include <iostream>

using namespace std;


int main()

 { unsigned long i,c,sum;

   //Wywevdane na chislo cifra po cifra otlqwo nadqsno 

 char otg='y';

 i=sum=0;//nachalna inicializaciq

 //sledim chisloto da ne nadhwyrlq dopustimata za tipa Long stojnost

  while (otg=='y' && i<9)


   { cout<<"Wywedete cifra: ";

      cin>>c;  //predpolaga se che potrebitelq ne wywevda chisla <0

      c%=10;//zashite po whod samo [0..9]

      sum*=10; //umnavawame po 10 poluchenoto do momenta chislo

      sum+=c; //pribawqme nowata cifra


      if (sum) i++;//broq wywedeni cifri - do 9-cifreno chislo

      //ako potrebitelq e wywevdal 0 w nachalto tq ne se broi za wywedena cifra

       cout<<"W momenta chisloto e: "<<sum<<endl;

       cout<<"She wywevdate li druga cifra <y/n>: ";


       cin>>otg;   

    }// while (otg=='y' && i<9)


  cout<<"Broj cifri w chisloto "<<sum<<" e: "<<i<<endl;



  cout<<"Sega izwevdam cifrite na chisloto otdqsno nalqwo:\n";

  

  while (sum) //dokato sum>0

  { cout<<"Naj-dqsnata cifra na chisloto e: "<<sum%10;

    sum/=10; //  maha se dqsnata cifra na chisloto

    cout<<"  W momenta chisloto e: "<<sum<<endl;        


   }  //  while (sum) 

    

    system ("pause");//chaka natiskane na klawish ot klawiaturata

    return 0;//wrysha kod na greshka 0 i oswobovdawa zaetite sistemni resursi

}//kraj na programata cifri w estestweno chislo

Начало на страницата


брой цифри на всички естествени числа от даден затворен интервал

Нека разгледаме още една програма реализираща решена задача за изчисляване брой цифри на всички естествени числа от даден затворен интервал. Необходими са два цикъла:

а) за обхождане на всяко число от интервала – в програмата е реализиран като цикъл for;
б) за преброяване на всички цифри в поредното естествено число – в тази програма алгоритъма е реализиран чрез рекурсивна функция.

#include <iostream>

using namespace std;


int chislo(int i)// rekursiq - opredelq broq cifri


  { int m;

   //rekursiwen wariant za prowerka broj 1-ci w dwoichnoto predstawqne

   if (i>0) 


   {i/=10; //premahwa naj-dqsnata cifra w chisloto

    return chislo(i)+1;}//rekursiwno obryshenie

    else return 0; //dyno na rekursiqta

   }//int chislo1(long i) izchislqwa broj 1 pri dwoichno predstawqne


int redica(int n, int m)//wynshen cikyl

   { int i,j,k; 

    //iteratiwen wariant za obhovdane na wsichki chisla ot interwala

     j=0;//inicializirane na obshata suma
 

     for (k=n; k<=m;k++)

      {i=chislo(k);//broj cifri w porednoto estestweno chislo

       //movete da zagradite kato komentar sledwashiq red

       cout<<"Chisloto "<<k<<" ima broj cifri "<<i<<endl;

       j+=i; // broj edinici w porednoto chislo


   }//for

  return j; 

}//broj cifri w estestweno chislo 


int main ()

{

  int m,n,p; 

  char ose;

  cout<<"Imate wywedeni 2 estestweni chislo M,N ot interwala [5..50005],\n";


  cout<<"zadawashi opredelen chislow interwal. Trqbwa da se izwede broq na\n";

  cout<<"cifrite na wsichki chisla ot interwala.\n";

  cout<<"Da se systawi programa, chrez koqto se izchislqwa obshiq broj\n";

  cout<<"na cifrite na wsichki estestweni chisla ot opredeleniq interwal.\n";


  cout<<"Primer: 5, 11 Izhod 9\n";

do {

   cout<<"Wywedete nachalno chislo [5..1005]: ";cin>>n;

   cout<<"Wywedete krajno chislo [5..1005]: ";cin>>m;


   p=redica(n,m);

   cout<<"Obsh broj cifri na chislata w redicata: "<<p<<endl;

   cout<<"She wywevdate li drugi chisla : ";cin>>ose;

  } while (ose=='y');


  system("pause");//izchakwa natiskane na klawish

  return 0;//oswobovdawa zaetite sistemni resursi i wrysha kod na greshka 0

}//kraj na programata cifri w  estestweno chislo

Начало на страницата

естествено число палиндром - рекурсия

Да разгледаме следната примерна задача изискваща рекурсивна функция:
Да се състави програма, чрез която се въвежда естествено число N от интервала [12..1234567]. Чрез рекурсивна функция програмата да извежда число, чиито цифри са написани в ред обратен на въведеното число. Да се извежда съобщение дали въведеното число е палиндром. Пример: 12321 Изход: 12321 да.

Алгоритъм:

Този алгоритъм изисква да не се въвеждат естествени числа кратни на 10. Ще формираме ново естествено число. Неговите цифри са същите по вид и брой, както на въведеното число, но са разположени в обратен ред. На всяка стъпка от въведеното число се маха последната, най-дясна цифра. Новото число се умножава по 10 и към полученото произведения се прибавя цифрата. Алгоритъма продължава своята работа, докато въведеното число N>0. Сравняваме въведеното и полученото число.

Следващата примерна програма дава решена задача за число палиндром:
#include <iostream>

using namespace std;


//tipa na funkciqta e prqko swyrzan s tipa na predawaoto i wryshaoto chislo

unsigned long ogledalo(unsigned long num, unsigned long obyr) {

   if(num > 0)


   {

   obyr = (obyr * 10) + (num%10) ;//praw hod na rekursiqta

   }

   else

   { return obyr;  //dyno na rekursiqta

   }


   return ogledalo(num/10,obyr);//rekursiwno izwikwane

}//ogledalo palindrom  estestweno chislo


int main () 

 {

   unsigned long chislo,chis;

   char ose;


   cout<<"Da se systawi programa, crez koqto se wywevda estestweno chilso\n";


   cout<<" N ot interwala [12..1234567]. Chrez rekursiwna\n";

   cout<<"funkciq programa da prowerqwa dali chisloto e palindrom.\n";

   cout<<"Da ne se wywevdat chisla kratni na 10.\n";

   cout<<"Primer: 12321 Izhod da.\n";


   do {

   cout<<"Wywedete stojnost [12..1234567]:   ";cin>> chislo;

   chis = ogledalo(chislo,0);

   cout<<"Chisloto, napisano w ogledalen wid: "<<chis<<endl;


   if (chis==chislo) cout<<"Wywedeoto chislo e palindrom\n";

   else cout<<"Dwete chisla sa razlichni\n";

   cout<<"She wywevdate li drugi chisla <y/n>: ";cin>>ose;


   }while (ose=='y');

return 0;

}//kraj na programa estestweno chislo palindrom 

Начало на страницата

огледално число с нечетни цифри

Имаме въведено естествено число N и търсим такова огледално число, което съдържа същия брой и вид нечетни цифри на N, но записани в обратен ред. Пример: 123445 Изход 531

  Следващата примерна програма дава решена задача за огледално число с нечетни цифри

#include <iostream>

using namespace std;


long int cifri(long int a)

{ long int b=0;

   int c;


  while (a)

  { c=a%10;

    if (c%2) {b*=10;b+=c;}

    a/=10;

  } //while

 return b;

}//cifri w  estestweno chislo 


int main()

{long int a,b;

char ose;

cout<<"Imame estestweno chislo a ot interwala [1001..1000001]. Tyrsim\n";

cout<<"takowa ogledalno chislo b, koeto sydyrva samo nechetnite cifri na a.\n";

cout<<"Primer: 123456789 Izhod: 97531\n";


do {

   cout<<"Wywedete estestweno chislo a: ";cin>>a;

   b=cifri(a);

   cout<<"Formiranoto nowo chislo e: "<<b<<endl;


   cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;

} while (ose=='y');

system("pause");

return 0;

}//kraj na programa nechetni cifri estestweno chislo 

Начало на страницата


число с римски цифри

Непозиционна бройна система се е запазила и до наши дни с най-яркото си проявление представяне най-често на списъци с римски цифри. При изписване на естествени числа с римски цифри е допустимо по-малка цифра да стои пред по-голяма като: IX. Една римска цифра не променя стойността си в зависмост от позицията си в числото, за разлика от най-разпространената в момента позиционната 10-ична бройна система. Да разгледаме следната примерна задача:
Да се състави програма, чрез която от клавиатурата се въвежда число с римски цифри. На изхода да се изведе същото естествено число, но представено с арабски цифри. Пример: XXIX Изход: 29

  Ползвайте следните означения
  I-1;
  V-5;
  X-10;
  L-50;
  C-100;
  D-500;
  M-1000
 
  Алгоритъмът променя знака на цифрата, ако тя е поставена пред цифра с по-голямо тегло.
  Следващата примерна програма дава решена задача за преобразуване на естествено число с римски цифри в арабско число:
#include<iostream>

#include<cstring>//strupr

 using namespace std;

int main()//nachalo na programata

{

const int Max_dyl=60;//dylvina na rimskoto chislo


const int br_rim=8;//broq latinski cifri

char chislo[Max_dyl],rim[]={"IVXLCDM"};

int a,b,dyl,arab,cifr1,cifr2,ar_c[br_rim]={1,5,10,50,100,500,1000};


 cout<<"Da se systawi programa, chrez koqto ot klawiaturata se wywevda \n";

 cout<<"chislo s rimski cifri. Programata da izwede syshoto chislo, no\n";


 cout<<"predstaweno s arabski cifri.\n";

 cout <<"Primer: XXIX Izgod 29.\n";

 cout<<endl;

 cout<<"Wywedete rimsko chislo: ";cin>>chislo;


 strupr (chislo);//samo s glawni bukvi

 dyl=strlen(chislo);//broj znaci w chisloto

 arab=cifr1=cifr2=0;//inicializacia


  for (a=dyl-1;a>-1;a--)//rimskoto chislo se chete otzad-napred

  { for (b=0; b<br_rim;b++)//mnovestwoto walidni rimski cifri

  { if (chislo[a]==rim[b])// ako ima takawa rimska cifra


   { cifr1=ar_c[b];

    if (cifr1<cifr2) {arab-=cifr1;}// po-malkata cifra se izwavda

      else {arab+=cifr1;}//rawna i po-golqma cifra se pribawq

     cifr2=cifr1;//

     }//ako e otkrita cifra

    }//prowerka rimska cifra-chislo

  }//poredniq znak ot chislo s rimski cifri 


 cout<<"Wywedenoto chislo s arabski cifri e: "<<arab<<endl;

  system("pause"); //zadyrva programata do natiskane na klawish ot klawiaturata

  return 0;//oswobovdawa zaetite sistemni resursi

}//kraj na programa rimski cifri estestweno chislo


Начало на страницата

цифри в дълго число

Ще казваме, че едно естествено число или рационално число е дълго число, когато неговата стойност надвишава допустимите стойности за вградените в езика типове променливи. Броят значещи цифри в едно дълго число значително надвишава 20. Възможно е едно дълго число да е естествено число - положително или отрицателно. Ще говорим за дълго число и ако необходимия брой цифри зад десетичната точка надхвърля допустимата точност за типовете променливи. Най-често дълго число се обработва като стринг.

Да разгледаме следната задача:
Имаме въведено дълго естествено число с брой цифри от интервала [4..44]. Трябва да се формират две нови естествени числа имащи същите цифри по брой и вид, така че да представят най-голямото и най-малко възможно дълго число със същите цифри. Водещи нули пред най-малкото число не се извеждат.
Пример: 12501 Изход: 52110, 1125
Използван алгоритъм: Предполага се, че въведеното дълго число е естествено число - цяло и положително. В допълнителен масив съхраняваме броя на всяка от възможните използвани 10 цифри на въведеното дълго число. Използваме масив от тип char за да съхраним въведеното дълго число и с цикъл до дължината на стринга определяме всяка от цифрите му. С вложен цикъл извеждаме съдържанието на масива - цифрата се печата толкова пъти, колкото е броят на срещанията й в дългото число. За най-голямото дълго число печата започва от цифрата 9 и завършва с цифрата 0, а за най-малкото от цифрата 1 (без водещи нули) и завършва с цифрата 9. При извеждането на двете дълги числа се отпечатват само намиращите се във входното дълго число цифри.

 Следващата примерна програма дава решена задача за работа с цифри в дълго естествено число:
#include <iostream>  

using namespace std; 

int const cif=10;//w 10-ichna brojna sistema cifrite sa 0,1,2,3,4,5,6,7,8,9


void vid_cifri (char dylgo[], int mas[]);

void pechat(int mas[]);



int main()

{ char dylgo[101],ose;

 int mas[cif],i,j;

 cout<<"Imate wywedeno estestweno chislo N s broj cifri [4..44].\n";

 cout<<"Da se systawi programa, chrez koqto se izwevdat dwe chisla\n";


 cout<<"imashi syshite cifri po broj i wid, taka che da formirat \n";

 cout<<"naj-golqmoto i naj-malkoto chislo s tezi cifri.\n";

 cout<<"Wodeshi nuli pred naj-malkoto chislo da ne se izwevdat.\n";

 cout<<"Primer: 12501 Izhod: 52110, 1125.\n";


   do {

     cout<<"Vyvedete chisloto: ";cin>>dylgo; 

     vid_cifri(dylgo,mas);

     pechat(mas);

   cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;


  } while (ose=='y');

   system("pause");

return 0; 

}//kraj na programa dylgo chislo 


void vid_cifri (char dylgo[], int mas[])

{int i,n;

  char cifra;


  for (i=0;i<cif;i++) mas[i]=0;//nachalna inicializaciq za broj cifri po wid

   n=strlen(dylgo);// obhs broj cifri na chisloto


   for (i=0;i<n;i++) //dokato namerim wsichki cifri w chisloto

    {cifra=dylgo[i];//porednata cifra otlqwo-nadqsno

     mas[cifra-'0']++;//uwelichawa broq namereni cifri po wid - cifra-'0'


   } //for i  

}//void cifri w estestweno chislo


void pechat(int mas[])

{int i,j,n;

   cout<<"Izwevdam naj-golqmto chislo:\n";

   for (i=0;i<cif;i++)


   { n=mas[cif-i-1];//broj ednakwi cifri

    for (j=0;j<n;j++) {cout<<cif-i-1;}

   } 

   cout<<endl;

   cout<<"Izwevdam naj-malkoto chislo:\n";


   for (i=1;i<cif;i++)//zpochwa ot 1

   { n=mas[i];//broj ednakwi cifri

    for (j=0;j<n;j++) {cout<<i;}

   } 

   cout<<endl;


}// izwevda dylgo estestweno chislo

Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.

Начало на страницата

 
Размер на шрифта
Increase Font Size Option 3 Reset Font Size Option 3 Decrease Font Size Option 3
Bulgarian Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish
Търсене в сайта: