超级大 正整数 乘法

/*

 Two big integer multiplied

 eg.

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111


1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
 * 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111 =
1234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234
320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654321

*/

#include<stdio.h>
#include<string.h>

char s1[10000];	// num1
char s2[10000];	// num2

int a1[10000];	// i of s1	* s2
int a2[10000];	// last ans
int ans[10000];	// current ans


void mulBigData(char *s1, char *s2){
	int i1, i2;			// for s1, s2 traversal
	int len1, len2;		// length of s1, s2
	int la1, la2, lan;	// length of a1, a2, ans
	int ai, ani;		// for a1, a2, ans traversal

	// eg. 123 * 12		-> 12 * 123
	// make s1 is short and s2 is long
	len1 = strlen(s1);
	len2 = strlen(s2);
	if(len1 > len2){
		char *tmps = s1;
		s1 = s2;
		s2 = tmps;
		len1 = strlen(s1);
		len2 = strlen(s2);
	}
	//printf("s1 = %s, s2 = %s\n", s1, s2);


	// init a1, a2, ans
	for(ai=0; ai<100; ai++){
		a1[ai] = 0;
		a2[ai] = 0;
		ans[ai] = 0;
	}
	la1 = 0;
	la2 = 0;
	lan = 0;
	

	// s1 * s2
	int v1, v2;	
	int j = 0;
	int z = 0;
	// eg. 12 * 123
	for(i1 = len1 - 1; i1 >= 0; i1--){
		// i of s1 * s2
		v1 = s1[i1] - '0';
		z = 0;
		for(ai=0; ai<j; ai++){	// carry bit
			a1[ai] = 0;
		}
		j++;


		// eg. 2 * 123   10 * 123
		for(i2 = len2 - 1; i2 >=0 ;i2--){
			v2 = s2[i2] - '0';
			int vv = v1 * v2;
			a1[ai++] = (vv % 10) + z;
			z = vv / 10;
		}
		if(z != 0){
			a1[ai++] = z;
		}
		la1 = ai;
		

		// ans += i of s1 * s2
		la2 = lan;
		for(ani = 0; ani < lan; ani++){
			a2[ani] = ans[ani]; //  copy ans to a2
		}		
		// show a1 and a2
//		printf("a1 = ");
//		for(ai=la1-1; ai>=0; ai--){
//			printf("%d", a1[ai]);
//		}printf("\n");

//		printf("a2 = ");
//		for(ai=la2-1; ai>=0; ai--){
//			printf("%d", a2[ai]);
//		}printf("\n");


		int az = 0;
		int asum = 0;
		for(ani=0; ani<la1 || ani<la2; ani++){
			asum = 0;
			if(ani < la1){
				asum += a1[ani];
			}
			if(ani < la2){
				asum += a2[ani];
			}
			asum += az;
			ans[ani] = asum % 10;
			az = asum / 10;
		}
		if(az != 0){
			ans[ani++] = az;
		}
		lan = ani;
		
		// show current ans
//		printf("ans = ");
//		for(ai=ani-1; ai>=0; ai--){
//			printf("%d", ans[ai]);	
//		}printf("\n\n");
	}
	
	// output the final answer!
	printf("\n%s * %s =\n", s1, s2);

	while(ans[--ani] == 0) ani--;	
	if(ani < 0)printf("0");

	for(ai=ani; ai>=0; ai--){
		printf("%d", ans[ai]);	
	}printf("\n\n");

}// end of mulBigData() 

int main(){
	while(scanf("%s %s", s1, s2)){
		mulBigData(s1, s2);
	}
	return 0;
}
/*

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111


1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
 * 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111
111 =
1234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234567901234
320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654320987654321

*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值