[OJ算法之路] 大整数乘法 & FFT

/*这段是坑B(错误示范)的代码*/
#include 
//#include 
#include 
//#include 
#define Val(a) (a - '0')
char A[1002];
char B[1002];
char C[2004];
char T[2004];
void Reverse(char *str){
	char temp[1001];
	int i,len = strlen(str);
	for(i = len - 1; i >= 0; i--){
		temp[len - i - 1] = str[i];
	}
	for(i = 0; i < len; i++){
		str[i] = temp[i];
	}
}
void trimz(char* a){
	/*after reverse*/
	int i,len = strlen(a);
	for(i = len - 1; i >= 0; i--){
		if(a[i] != '0')
			return ;
		else
			a[i] = '\0';
	}
}
void pre_p(char* a, char* b){
	Reverse(a);
	Reverse(b);
	int len_a = strlen(a),len_b = strlen(b);
	int i,Len = len_a > len_b ? len_a : len_b;
	if(len_a > len_b){
		for(i = len_b; i < len_a; i++){
			b[i] = '0';
		}
		b[i] = '\0';
	}
	else{
		for(i = len_a; i < len_b; i++){
			a[i] = '0';
		}
		a[i] = '\0';
	}
	a[Len] = b[Len] = '0';
	a[Len+1] = b[Len+1] = '\0';
}
void do_plus(char *a, char *b, char *c){
	pre_p(a,b);
	int len = strlen(a);
	int i,add = 0;
	int temp;
	for(i = 0; i < len; i++){
		temp = Val(a[i]) + Val(b[i]) + add;
		c[i] = temp % 10 + '0';
		//printf("%c %c %d %d\n",a[i], b[i], add, ((Val(a[i]) + Val(b[i]) + add) / 10 ) % 10);
		add = (temp / 10 ) % 10;
	}
	if(c[len - 1] == '0'){
		c[len - 1] = '\0';
	}
	Reverse(c);
}
/**/
void leftshift(char *a, int num){
	/* a not reverse number */
	if(strcmp(a,"0") == 0)
		return;
	int len = strlen(a);
	a[len + num] = '\0';
	while(num){
		a[len+num - 1] = '0';
		num--;
	}
}
void do_OneMulti(char *a, int x, char *c){
	/*c will be changed*/
	Reverse(a);
	int i,add = 0;
	int len = strlen(a);
	a[len] = '0';
	a[len + 1] = '\0';
	len = strlen(a);
	for(i = 0; i < len; i++){
		c[i] = ((Val(a[i]) * x + add) % 10) + '0';
		//printf("%d\n",Val(a[i]) * x);
		add = (((Val(a[i]) * x + add) / 10) % 10);
	}
	i = strlen(c) - 1;
	while(c[i] == '0' && i > 0){
		c[i] = '\0';
		i--;
	}
	
	trimz(a);Reverse(a);
	Reverse(c);
}
void do_multi(char *a,char *b, char *c){

	Reverse(b);
	C[0] = '0';
	C[1] = '\0';
	int i, len = strlen(b);

	for(i = 0; i < len; i++){

		do_OneMulti(a, Val(b[i]), T);
		//printf("%s*%d=%s\n",a,Val(b[i]),T);
		leftshift(T, i); 
		//printf("leftshift%d=%s\n",i,T);
		do_plus(T, C, C);
		//printf("%s\n",C);
	}
}

int main(){
	scanf("%s",A);
	scanf("%s",B);
	//scanf("%s",B);
	do_multi(A,B,C);
	printf("%s",C);

	//system("pause");
	return 0;
}


你可能感兴趣的:(算法)