初识malloc & 高精度加法

48 阅读2分钟

题目一

image.png

思路解析

当看到要处理数组里面的两个对象时,很容易想到双重循环,所以这里直接双循环来让数组两个不同的key相加凑target,就这么简单吧,当找到一个的时候就可以把他们存进一个数组里面return出来。

关键点

1.当我写函数的时候很容易忘记什么时候要用到指针变量,于是经过查询得到以下结果:

image.png

2.遇到的坑就是我想返回 return [i,j],但是很可惜不可以回复两个值,所以最后存到了数组里面然后输出。顺带一提这个数组需要被MALLOC。因为你这个函数本来就是int* 类型的,需要通过malloc调用内存然后才能安全通过函数返回。

我的代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
    int i, j;
    *returnSize=2;
    int *ans=(int*)malloc(2*sizeof(int));
    for (i = 0; i < numsSize - 1; i++) {
        for (j = i + 1; j < numsSize; j++) {
            if (nums[i]+nums[j]==target){
                ans[0]=i;
                ans[1]=j;
                return ans;
            }
        }
    }
    
    *returnSize=0;
    free(ans);
    return NULL;
}

题目二

image.png

思路解析

这是经典的高精度加法题,思想就是把两个或者若干个加数先用字符串读入,然后再转化成数组(这个过程要倒序录入,目的是让a[1] 是个位。然后逐位相加。

关键点

1.倒序的时候容易忘记lenA-i-1;
2.lenC=(lenA>lenB ? lenA : lenB)

我的代码

#include<stdio.h>
#include<string.h>
#include<math.h>

int main()
{
	char s1[505],s2[505];
	int a[505]={0},b[505]={0},c[505]={0};
	scanf("%s",s1);
	scanf("%s",s2);
	
	int lenA=strlen(s1);
	int lenB=strlen(s2);
	
	int lenC=(lenA>lenB ? lenA : lenB)+1;  //因为a+b的结果c位数一定是这两个数字最大位数+1
	
	int i;
	for(i=0;i<lenA;i++){
		a[i]=s1[lenA-i-1]-'0';//这一步换成数字,并且把数字倒转过来让a[1]表示个位 
	}
	for(i=0;i<lenB;i++){
		b[i]=s2[lenB-i-1]-'0';
	}
	
	int j;
	for(j=0;j<lenC;j++){
		c[j]+=a[j]+b[j];
		c[j+1]=c[j]/10;
		c[j]%=10;        //这一块是高精度加法的核心思想!!!
	}
	if(c[lenC-1]==0 && lenC>0) lenC--;
	for(i=lenC-1;i>=0;i--){
		printf("%d",c[i]);
	}  //最后不忘记倒过来输出,毕竟c[1]是个位
	
	
	return 0;
}