1. 程式人生 > 其它 >leetcode-陣列形式的整數加法-7

leetcode-陣列形式的整數加法-7

技術標籤:oj題

陣列形式的整數加法

題目要求
  對於非負整數x而言,x的陣列形式是每位數字按從左到右的順序形成的陣列。例如,如果x=1231,那麼其陣列形式為[1,2,3,1]。給定非負整數x的陣列形式A,返回整數x+k的陣列形式。
示例1:
輸入:A = [2,1,5],k = 806
輸出:[1,0,2,1]
解釋:215 + 806 = 1021
思路
  第一步,通過兩個數字的位數判斷開闢空間的大小,開闢空間大小要比數字的位數大一位,為了防止最高位進位。第二步,計算兩個數的每一位的值,並將這些加在一起,存在建立的新空間中。第三步,檢測最高位是否進位,如果進位,需要在最高為上新增一個1。第四步

,由於新陣列中我們是從低位到高位往陣列中進行輸入,因此,需要把新陣列中的元素進行逆序,注意,我們不能將輸入的低位數字直接放到陣列的末尾,因為,不確定最高位是否需要進位,也就不知道低位放在新陣列中的哪一個下標處。
圖解
在這裡插入圖片描述

程式碼實現

int* addToArrayForm(int* A, int ASize, int K, int* returnSize){
	//計算K是一個幾位數
	int num = K;
	int KSize = 0;
	while (num)
	{
		num /= 10;
		KSize++;
	}

	//判斷記憶體應該建立多大
	int n = KSize > ASize ? KSize + 1 : ASize + 1;

	//建立記憶體
	int* str = malloc(sizeof(int)*n);

	int KNum = 0;//某一位K的值
	int Ai = ASize - 1;//A中陣列的下標
	int next = 0;//進位
	int i = 0;//str的下標
	while (K > 0 || Ai >= 0)
	{
		//計算某一位K的值
		KNum = K % 10;
		K /= 10;

		int ANum = 0;//某一位A的值
		//計算某一位A的值
		if (Ai >= 0)
		{
			ANum = A[Ai];
			Ai--;
		}

		//判斷是否進位
		int ret = KNum + ANum + next;
		if (ret >= 10)
		{
			ret %= 10;
			next = 1;
		}
		else
		{
			next = 0;
		}

		//將每一位的值傳進str
		str[i] = ret;
		i++;
	}

	//最高位進位
	if (next == 1)
	{
		str[i] = 1;
		i++;
	}

	//控制輸出元素個數
	*returnSize = i;

	//逆置
	int left = 0;
	int right = i - 1;
	while (left <= right)
	{
		int tmp = str[left];
		str[left] = str[right];
		str[right] = tmp;
		left++;
		right--;
	}

	return str;
}