对于非负整数X,有数组A是按照X从左到右每一位的顺序组成的数组,给定数组A,再给一个整数K,返回X+K的数组形式。
//第一次尝试:
//本题其实就是将数字中的元素拿出来依次排列组成一个整数,然后将这个整数和k相加,再将得到的结果一位一位放到数组中
//但是由于数组的长度可能会很大,那么转换过来的数字将不好表示,所以只能将使用另一种方法;
//我们可以将数组A中的每一位数字从后向前,依次和k相加,然后将k与10求余的值放到一个新的数组中,再将k与10求商的值赋给k,
// 然后依次循环下去,直到新开辟的数组放满或者k为0或者数组A遍历完,这个结束条件需要好好想一想;
// 因为两个数字相加,得到的结果不可能比最大的那个数大两个数量级,所以新开辟的数组只需比A和K中最大的多一位即可;
// 最终得到的结果有可能进位,也有可能没进位,例如:111+222=333就是没进位,501+501=1002就是进位了;
// 我们可以先不用管最后的结果进位没,先把得到的结果放到新的数组ret中,然后增加一个判断,
// 如果ret首元素为零,那就没进位,返回++ret,如果不为零,则进位了,最终返回ret;这样就可解决问题;
#include<stdio.h> #include<stdlib.h> int* addToArrayForm(int* A, int ASize, int K, int* returnSize) { if (K == 0) { *returnSize = ASize; return A; }
//求K的位数,然后和ASize比较,最大的+1就是新申请数组的大小 int count = (log10(K) + 1) > ASize ? (log10(K) + 2) : ASize + 1; *returnSize = count; int* ret = (int*)calloc(count, sizeof(int)); if (ret == NULL) return NULL; while (ASize >= 0) { if (--ASize >= 0) K = A[ASize] + K; ret[--count] = K % 10; K /= 10; } if (ret[0] == 0) { ret[--count] = K;
//做判断,如果首元素是0,那就将数组的大小-1,并将返回第二个元素的地址 (*returnSize)--; return ++ret; } else
//如果首元素不是0,那么就返回数组的首地址 return ret; } int main() { int num[] = { 8,6,8 }; int k = 689; int size = 0; int* ret = addToArrayForm(num, sizeof(num) / sizeof(num[0]), k, &size); for (int i = 0; i < size; i++) { printf("%d", ret[i]); } printf("\n"); return 0; }
浙公网安备 33010602011771号