Infinite Retrieval
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Помогите пожалуйста. Писал программу, считающую факториал больших чисел (и не только). В итоге она записывает ответ в виде данных - массив unsigned char. Как можно вывести на экран длинное шестнадцатеричное число в десятичной форме? Тобишь сделать это как-то поразрядно блоками. Естественно простое суммирование поразрядно с домножением на степень 16и не катит - весь сыр бор программы в том, что значения огромны, массив длинный. Добавлено: На выходе - массив result. Идёт перемножение стобиком, блоками по байту. Код: #define MAX 100 #include <iostream> #include <stdio.h> #include <conio.h> #include <math.h> using namespace std; int *abc; char *in; float *out_eq; long long *out_fa; bool infinit_flag=true; void null_2d(unsigned char nu[MAX][MAX]) { int w,e; for(e=0; e<MAX; e++) for(w=0; w<MAX; w++) nu[w][e]=0; } void str_to_num(unsigned char *string) { char bufff[MAX]; int v,h; for(h=0; string[h]; h++) *(string+h)-='0'; for(v=0; v<h; v++) bufff[v]=string[h-v-1]; } void s_to_uns(unsigned char *ou, char *s) { int i=0; while(*(s+i)) { *(ou+i)=((*(s+i))+0x100)%0x100; i++; } *(ou+i)=0; } void mult(unsigned char *x, unsigned char *y, unsigned char *z) { unsigned int A,B,su,i,j; static unsigned char one[MAX][MAX]; j=0; null_2d(one); for(B=0; B<MAX; B++) { for(A=0; A<MAX; A++) { su = x[A] * y[B]; one[B][A] += (su%256); one[B][A+1] = su/0x100; } } for(i=0; (i+j+1)<MAX; i++) { for(; j<i+1; j++) z[i+j] = one[i][j]; su = one[i][j] + one[i+1][i]; z[j+i] = su%0x100; z[j+i+1]= su/0x100; } } unsigned char *minus_1(unsigned char *strin) { int ii=0; while( strin[ii]==0x00 ) { strin[ii]=0xFF; ii++; if(ii>=MAX) break; } strin[ii]--; return strin; } void Fa_n() { unsigned char *result, *uin; bool zero=false; int cou, number,t; void str_to_num(unsigned char *); void s_to_uns(unsigned char *, char *); void null_2d(char[MAX][MAX]); void nullbuf(char *, int); void nullbuf(unsigned char *, int); unsigned char *minus_1(unsigned char *); void mult(unsigned char *x, unsigned char *y, unsigned char *z); result = new unsigned char [MAX]; uin = new unsigned char [MAX]; nullbuf(in,MAX); nullbuf(result,MAX); nullbuf(uin,MAX); cout<<"Enter the number, I'll count its factorial "; cin>>in; if(strlen(in)>4) { cout<<"Your number is very big"; return; } for(cou=0; in[cou]; cou++) { if( (in[cou]<'0')||(in[cou]>'9') ) { cout<<"This is not number! "; return; } } number=atoi(in); s_to_uns(result,in); s_to_uns(uin,in); str_to_num(result); str_to_num(uin); for(cou=1; cou<number-1; cou++ ) mult(result, minus_1(uin), result); /*for(cou=0; cou<MAX; cou++) { putch( result[cou+1] result[cou]%10 + '0';*/ delete result; delete uin; } void Fa_r() { int vv,stlen; char mad[MAX]; long long Fa_r_(int ); int nn; cout<<"Enter the number"; cin>>mad; stlen=strlen(mad); for(vv=0; vv<stlen; vv++) { if( (mad[vv]<'0')||(mad[vv]>'9') ) { cout<<"This is not number! "; return; } } nn=atoi(mad); cout<<Fa_r_(nn); } long long Fa_r_(int param) { if(param==1) return 1; return (param*Fa_r_(param-1)); } void nullbuf(char *BU, int QU) { int tempr; for(tempr=0; tempr<QU; tempr++) *(BU+tempr)=0; } void nullbuf(unsigned char *BU, int QU) { int tempr; for(tempr=0; tempr<QU; tempr++) *(BU+tempr)=0; } void enter_ints(char *in_, int in_q, int *out_, int out_q) { int k=0,j=0,c=0; char *buf; buf = new char [in_q]; void nullbuf(char *buffer,int quontity); nullbuf(in_,MAX); while (c<out_q) { cout<<"Enter the a,b,c of quard equation"; scanf("%s",in_); while(k<in_q) { if(in[0]==0) break; if(in[k]==0) { buf[k]=0; k=0; out_[c]=atoi(buf); nullbuf(buf, in_q); j=0; c++; break; } if( (in_[k]>='1')&&(in_[k]<='9')||(in_[k]=='.') ) { buf[j]=in_[k]; j++; k++; } if(in_[k]==' ') { out_[c]=atoi(buf); nullbuf(buf, in_q); j=0; c++; } } } delete buf; } void work() { char mode; void Eq(); void Fa_n(); void Fa_r(); cout<<"Quard (e)quation, or (f)actorial, or (q)uit?"; mode=getch(); if( (mode=='e')||(mode=='E') ) Eq(); else if( (mode=='f')||(mode=='F') ) { cout<<"Would you like (n)ormall factorial, or stupid (r)eccursive version? "; mode=getch(); if( (mode=='n')||(mode=='N') ) Fa_n(); if( (mode=='r')||(mode=='R') ) Fa_r(); } else if( (mode=='q')||(mode=='Q') ) infinit_flag=false; else return; } int main() { void work(); abc = new int [3]; out_eq = new float [2]; in = new char [MAX]; while(infinit_flag) work(); delete in; delete abc; delete out_eq; return 0; } void Eq() { float d; void enter_ints(char*,int,int*,int); enter_ints(in, MAX, abc, 3); d = abc[1]*abc[1] - 4*abc[0]*abc[2]; if(d<0) { cout<<"No solutions: \n"; return; } if(d==0) { cout<<"One solution "; out_eq[0] = ((float)(-abc[1]))/(2*abc[0]); cout<<out_eq[0]; return; } if(d>0) { cout<<"Two solutions: "; out_eq[0] = (-abc[1]+sqrt(d)) / (2*abc[0]); out_eq[1] = (-abc[1]-sqrt(d)) / (2*abc[0]); cout<<out_eq[1]<<out_eq[2]; return; } } | Очень прошу вас помоч. |