C语言求和为S的连续正数序列
解题思路
暴力破解法,对于一个数字9,组成这个数的连续数字:2+3+4 或者4+5,如果说中间数是4,那么一定不会包含中间数往右数两个,也就是起始位置不可能位于中间数右侧,想一下中间数至少为n/2 + 1。
注意事项
-
不包含0
-
int** FindContinuousSequence(int sum, int* returnSize, int** returnColumnSizes ) ,又迷糊在了这个 returnColumnSizes参数上,这是一个二重指针,指向指针的指针,指向的是每一个数组的长度,也就是一个数组,因此去初始化的时候,将其初始化成一个数组指针。
*returnColumnSizes=(int *)malloc(sizeof(int)*15);//指向15个整型元素
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param sum int整型
* @return int整型二维数组
* @return int* returnSize 返回数组行数
* @return int** returnColumnSizes 返回数组列数
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
int** FindContinuousSequence(int sum, int* returnSize, int** returnColumnSizes ) {
// write code here
if(sum<=1)
return NULL;
int **ans=(int **)malloc(sizeof(int *)*15);
*returnColumnSizes=(int *)malloc(sizeof(int)*15);
int ans_num=0;
//穷举,i表示起始位置
int temp=0;
for(int i=1;i<=sum/2;i++){
temp=0;
for(int j=i;j<=(sum/2+1);j++)
{
temp+=j;
if(temp>sum)
break;
//说明i~j是一个解
else if(temp==sum){
ans[ans_num]=(int *)malloc(sizeof(int)*(j-i+1));
int top=0;
for(int k=i;k<=j;k++){
ans[ans_num][top++]=k;
}
(*returnColumnSizes)[ans_num++]=(j-i+1);
break;
}
}
}
* returnSize=ans_num;
return ans;
}