Помогите,пожалуйста, разобраться как работает программа - генерация палиндромов методом симметричных сумм:
Код:
#include<iostream>
#include<string.h>
using namespace std;
class chislo
{
public: char *number;
chislo(char *base)
{
number = new char [strlen(base)+1];
strcpy(number,base);
}
chislo(int size)
{
number = new char [size]; }
void invers(chislo base);
void zero(char*,int); //udalyaet perednie nuli, naprimer 00023405->23405
chislo operator+ (chislo) const;
int polindrom(); //proverka yavlyetsa li 4islo polindromom
~chislo() { };
};
До этого момента все понятно
Код:
void chislo::invers(chislo base)
{
int i;
int size=strlen(base.number);
for(i=0; i<size;i++)
В этом месте непонятно, что происходит:
Код:
*(number+i)=*(base.number+size-1-i);
*(number+size)='\0';
Код:
};
void chislo::zero(char* arg,int zero)
{
int i,size;
size=strlen(arg)-zero;
for(i=0;i<size;i++)
*(number+i)=*(arg+zero+i);
*(number+size)='\0';
}
chislo chislo::operator+ (chislo inv_base) const
{
int perenos=0,sum_raz,i;
int size=strlen(number)+1;
chislo temp(size+1);
for(i=0;i<size-1;i++)
{
sum_raz=(*(number+size-2-i)-'0')+(*(inv_base.number+size-2-i)-'0');
*(temp.number+size-1-i)=(sum_raz%10+perenos)%10+'0';
if(sum_raz+perenos>=10) perenos=1; else perenos=0;
}
if(perenos) *temp.number='1'; else *temp.number='0';
*(temp.number+size)='\0';
return temp;
}
int chislo::polindrom()
{
int i,polindrom;
int right=0,wrong=0;
for(i=0;i<=strlen(number)/2;i++)
if(*(number+i)==*(number+strlen(number)-1-i)) right++; else wrong++;
if(polindrom=((right>0) && (wrong==0)))
return 1; else return 0;
}
int main(int argc,char *argv[])
{
int size,i,zero,rezim=0,count=0;
char error_msg[]="Wrong arguments\nFormat vvoda: SYMSUM chislo nomer_rezima\nNomer rezima yavlaetsa neobyazatelnim argumentom, mozet prinimat' znachenia:\n0 - rezim po umolchaniu, 1 - rezim diagnostiki.\nNaprimer: SYMSUM 378791 1 ili SYMSUM 51174";
/* vsevozmonie proverki vvodimih argumentov */
//////////////////////////////////////////
if(!(argc==2 || argc==3)) //proverka na kol-vo argumentov
{ cerr<<error_msg; exit(0); }
if(argc==3) // rezim
if((*argv[2])=='1' && strlen(argv[2])==1) rezim=1; //proverka na tip argumentov
else if((*argv[2])!='0' || strlen(argv[2])!= 1) { cerr<<error_msg; exit(0);}
for(i=0;i<strlen(argv[1]);i++)
if(isdigit(argv[1][i])) ; else { cerr<<error_msg; exit(0);}
if(strlen(argv[1])==1) { cout<<argv[1]<<" is allready polyndrom\nKol-vo iteracii="<<count; return 0;} //если одна цифра -> уже полиндром
chislo base(argv[1]);
////////////////////////////////////////////
if(argv[1][0]!='0') //проверка на передние нули
zero=0;
else
for(i=1,zero=1;argv[1][i]=='0';i++)
zero++;
chislo base_zero(strlen(argv[1])+1-zero);
base_zero.zero(argv[1],zero);
size=strlen(base.number)+1;
if(zero)
base=base_zero;
if(strlen(base.number)==1 || base.polindrom()) { cout<<base.number<<" is allready polindrom.\nKol-vo iteracii="<<count; exit(0);}
chislo inv_base(size);
inv_base.invers(base);
chislo sum(strlen(base.number)+2);
sum=base+inv_base;
if(*sum.number=='0') sum.zero(sum.number,1);
count=1;
if(sum.polindrom() && rezim==1)
{
cerr<<"Rezim diagnostiki:\nStep "<<count<<"\nBase of polindrom="<<base.number<<" Symmetric base="<<inv_base.number<<endl;
cerr<<base.number<<"+"<<inv_base.number<<"="<<sum.number<<" - polindrom\nKol-vo iteracii="<<count<<endl;
exit(0);
}
if(!sum.polindrom() && rezim==1)
cerr<<"Rezim diagnostiki:\n";
while(!sum.polindrom())
{
if(rezim==1)
{
cerr<<"Step "<<count<<"\nBase of polindrom="<<base.number<<" Symmetric base="<<inv_base.number<<endl;
cerr<<base.number<<"+"<<inv_base.number<<"="<<sum.number<<" - ne polindrom\nKol-vo iteracii="<<count<<endl;
}
base=sum;
inv_base.invers(base);
sum=base+inv_base;
if(*sum.number=='0') sum.zero(sum.number,1);
count++;
if(count>=1000) { cerr<<"Polindrom ne naiden"<<endl; exit(1);}//-------- c этой строчкой ошибка в винде
}
if(rezim==1)
{
cerr<<"Step "<<count<<"\nBase of polindrom="<<base.number<<" Symmetric base="<<inv_base.number<<endl;
cerr<<base.number<<"+"<<inv_base.number<<"="<<sum.number<<" - polindrom\n________________________________________________________________\n\nItogovii polindrom="<<sum.number<<"\nKol-vo iteracii="<<count<<endl;
exit(0);
}
cout<<"Itogovii polindrom="<<sum.number<<"\nKol-vo iteracii="<<count<<endl;
return 0;
}