Естествено число - римски цифри, палиндром
Често се бъркат понятията число и цифра.
Всяко число е съставено от цифри, обратното твърдение е невярно.
В десетичната позиционна бройна система цифрите са 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
Обяснени и решени задачи с подобни алгоритми, функции и служебни думи са разгледани в страницата с електронни уроци по информатика - програмиране.
Илюстриране работата на характерни алгоритми можете да намерите в предоставените електронни помагала съдържащи решени задачи, примери.
Начало на страницата