1. 程式人生 > >codevs3115 高精度練習之加法

codevs3115 高精度練習之加法

3115 高精度練習之加法

 時間限制: 1 s  空間限制: 64000 KB  題目等級 : 黃金 Gold 題目描述 Description

給出兩個正整數A和B,計算A+B的值。保證A和B的位數不超過500位。

輸入描述 Input Description

讀入兩個用空格隔開的正整數

輸出描述 Output Description

輸出A-B的值

樣例輸入 Sample Input

3 12

樣例輸出 Sample Output

15

資料範圍及提示 Data Size & Hint

兩個正整數的位數不超過500位


實際就是對陣列的處理,倒置對應位相加。最後用歸併排序的思想進行處理。(注意最後要將結果倒置回來,而且要注意進位) AC程式碼
#include <stdio.h>
#include <string.h>

char a[1001];
char b[1001];
char c[1001];

void swap(char target[]) {
	int i;
	int j;
	char temp;

	for(i = 0,j = strlen(target) - 1;i <= j;i++,j--) {
		temp = target[i];
		target[i] = target[j];
		target[j] = temp;
	}
}

void add(char a[],char b[]) {
	int i;

	for(i = 0;i < strlen(a) && i < strlen(b);i++) {
		c[i] += a[i] + b[i] - '0';
        if(c[i] - '0' >= 10){
            c[i] = c[i] - 10;
            c[i+1] = 1;
        }
	}
	//先將對其的進行運算
	if(strlen(a) == strlen(b)) {
        if(c[i] == 1) 
            c[i]='1';
	}
	//長度相等,看是否進一位
	if(strlen(a) > strlen(b)){
        if(c[i] == 1) {//進位的話就得每位進行累加
            for(;i < strlen(a);i++){
                c[i] += a[i];
                if(c[i] - '0' >= 10) {
                    c[i] = c[i] - 10;
                    c[i+1] = 1;
                }
            }   

			if(c[i-1] == '0')//最後一位進位
				c[i] = '1';
        }
		else { //不進位的話就直接把陣列接在後面
			for(;i < strlen(a);i++)
				c[i] = a[i];
		}
	}

    if(strlen(b) > strlen(a)){
        if(c[i]==1){
            for(;i < strlen(b);i++){
                c[i] += b[i];
                if(c[i] - '0' >= 10){
                    c[i] = c[i] - 10;
                    c[i+1] = 1;
                }
            }
			if(c[i] == 1)
				c[i] = '1';
		} else { 
			for(;i < strlen(b);i++)
				c[i] = b[i];
		}
	}
}

int main(void) {
	scanf("%s",a);
	scanf("%s",b);
	swap(a);
	swap(b);
	add(a,b);
	swap(c);

	printf("%s\n",c);
	
	return 0;
}