#include #include #include #include int chksym(char *str); void reverse(char *str); void str_to_mpz(mpz_t des, char *src); int main() { char *str; int counter=0,cycle=0,val=1; mpz_t addend1,addend2,sum; mpz_init(addend1); mpz_init(addend2); mpz_init(sum); for(;val<10000;cycle=0,free(str),val++) { do { if(cycle==0) { mpz_set_si(addend1,val); str=mpz_get_str(NULL,10,addend1); } else str_to_mpz(addend1,str); reverse(str); str_to_mpz(addend2,str); mpz_add(sum,addend1,addend2); free(str); str=mpz_get_str(NULL,10,sum); }while(chksym(str) && ++cycle<50); if(cycle==50) counter++; } printf("\n\t%i\n\n",counter); return 0; } int chksym(char *str) { int length=0; for(;str[length]!='\0';length++); if(length>1) { int a=(length/2); for(;a>0;a--) if(str[a-1]!=str[length-a]) return 1; } return 0; } void reverse(char *str) { int a=1,length=0; for(;str[length]!='\0';length++); if(length>1) { char reversed[length+1]; for(;a<=length;a++) reversed[a-1]=str[length-a]; reversed[length]='\0'; for(;a>=0;a--) str[a]=reversed[a]; } } void str_to_mpz(mpz_t des, char *src) // All mpz passed to the functions { // are pointers (also if not if(src!=NULL) // expressed!) { int a,length=0; mpz_t addend,base,scientific_notation; mpz_init(addend); mpz_init_set_ui(base,10); mpz_init(scientific_notation); for(;src[length+1]!='\0';length++); mpz_set_ui(des,src[length]-48); for(a=length-1;a>=0;a--) { mpz_pow_ui(scientific_notation,base,length-a); mpz_mul_ui(addend,scientific_notation,src[a]-48); mpz_add(des,des,addend); } } }