大数相加(正整数)

// hdu 1002 http://acm.hdu.edu.cn/showproblem.php?pid=1002
/*10进制   15ms
#include <bits/stdc++.h>
using namespace std;
const int AX = 1e3 + 666 ;
char s1[AX];
char s2[AX];
int a[AX];
int b[AX];
int main() {
	int T , Case = 0 ; 
	scanf("%d",&T);
	while( T-- ) {
		printf("Case %d:\n",++Case);
		scanf("%s%s",s1,s2) ;
		printf("%s + %s = ",s1,s2);
		int len1 = strlen(s1);
		int len2 = strlen(s2);
		memset( a , 0 , sizeof(a) ) ;
		memset( b , 0 , sizeof(b) ) ;
		for( int i = 0 ; i < len1 ; i++ ){
			a[i] = s1[len1-i-1] - '0' ;
		}
		for( int i = 0 ; i < len2 ; i++ ){
			b[i] = s2[len2-i-1] - '0' ;
		}
		int k = max( len1 , len2 );
		int c = 0 ;
		for( int i = 0 ; i < k ; i++ ){
			a[i] = a[i] + b[i] + c ;
			c = a[i] / 10 ;
			a[i] %= 10 ; 
		}
		if( c ) a[k] += c ; 
		for( int i = k ; i >= 0; i-- ){
			if( i == k && !a[i] ) continue ;
			printf("%d",a[i]);
		}printf("\n");
		if(T) printf("\n") ;
	}
	return 0 ;
}*/
//10000进制,0ms
#include <bits/stdc++.h>
using namespace std;
const int AX = 1e3 + 666 ;
char s1[AX];
char s2[AX];
int a[AX];
int b[AX];
int f( int* x , char* s , int len ){
	string tmp = "" ;
	int tot = 0 ;
	for( int i = len - 1 ; i >= 0 ; i -= 4 ){
		for( int j = max( 0 , i - 3 ) ; j <= i ; j++ ){
			tmp += s[j] ; 
		}
		x[tot++] = atoi(tmp.c_str());
		tmp = ""  ;
	}
	return tot ;
}
int main() {
	int T , Case = 0 ; 
	scanf("%d",&T);
	while( T-- ) {
		printf("Case %d:\n",++Case);
		scanf("%s%s",s1,s2) ;
		printf("%s + %s = ",s1,s2);
		int len1 = strlen(s1);
		int len2 = strlen(s2);
		memset( a , 0 , sizeof(a) ) ;
		memset( b , 0 , sizeof(b) ) ;
		len1 = f( a , s1 , len1 ); 
		len2 = f( b , s2 , len2 ); 
		int k = max( len1 , len2 );
		int c = 0 ;
		for( int i = 0 ; i < k ; i++ ){
			a[i] = a[i] + b[i] + c ;
			c = a[i] / 10000 ;
			a[i] %= 10000 ; 
		}
		if( c ) a[k] += c ;
		int f = 0 ;
		for( int i = k ; i >= 0; i-- ){
			if( i == k && !a[i] ) continue ;
			if( f ) printf("%04d",a[i]);
			else{ printf("%d",a[i]); f = 1 ; }
		}printf("\n");
		if(T) printf("\n") ;
	}
	return 0 ;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值