1. 程式人生 > 實用技巧 >CSP-S 2019 Solution

CSP-S 2019 Solution

技術標籤:演算法

就像小學的數學運算題一樣,遇到10就進1;

but 這次,咋們用的是字元陣列,而不是整形陣列了

為啥?(char一個位元組,int4個,你說用哪個)

老規矩,先上圖
在這裡插入圖片描述兩個大數我們可以用字元陣列來儲存,然後在陣列中逐位進行相加,再判斷該位相加後是否需要進位,為了方便計算,我們將數字的低位放在陣列的前面,高位放在後面。

#include<stdio.h>
#include<string.h>
 
#define MAX 1000    // 大數的最大位數 
 
int Addition(char num1[], char num2[], int sum[]
); int main() { int i, len; int sum[MAX] = {0}; // 存放計算的結果,低位在前,高位在後,即sum[0]是低位 char num1[] = "1234567891234567891234"; // 第一個大數 char num2[] = "2345678912345678913345"; // 第二個大數 len = Addition(num1, num2, sum); // 兩數相加 printf("%s\n +\n%s\n =\n", num1,
num2); // 反向輸出求和結果 for (i = len-1; i >= 0; i--) printf("%d", sum[i]); printf("\n"); return 0; } int Addition(char num1[], char num2[], int sum[]) { int i, j, len; int n2[MAX] = {0}; int len1 = strlen (num1); // 計算陣列num1的長度,即大數的位數 int len2 =
strlen (num2); // 計算陣列num2的長度,即大數的位數 len = len1>len2 ? len1 : len2; // 獲取較大的位數 //將num1字元陣列的數字字元轉換為整型數字,且逆向儲存在整型陣列sum中,即低位在前,高位在後 for (i = len1-1, j = 0; i >= 0; i--, j++) sum[j] = num1[i] - '0'; // 轉換第二個數 for (i = len2-1, j = 0; i >= 0; i--, j++) n2[j] = num2[i] - '0'; // 將兩個大數相加 for (i = 0; i <= len; i++) { sum[i] += n2[i]; // 兩個數從低位開始相加 if (sum[i] > 9) // 判斷是否有進位 { // 進位 sum[i] -= 10; sum[i+1]++; } } if(sum[len] != 0) // 判斷最高位是否有進位 len++; return len; // 返回和的位數 }