标签:
题目描述如下:
看到这个题目,最容易想到的是暴力搜索法。然而,那不是好的办法,也是acm无法通
过的办法。
思路分析:对于给定的数组,我们必须先对其进行小到大的排序。如果最小的数不是
1(大于1),输出的结果必然就是1啦。如果是1,通过当前数与前边所有数的和加1进
行比较,如果当前数小于等于前边数的和加1,那么当前数也是可以找到它的几个因数
的;否则,直接返回前边数的和加1.跳出循环的有两种情况,break和循环终止条件,如
果是终止条件出来的,那就是说明从1到数组中所有元素的和,都可以找到它的因子,
此时返回所有数的和加1即可。
【源代码】
#include<stdio.h>
#include<malloc.h>
void sort(int arr[], int num)
{
int i = 0;
int j = 0;
int tmp = 0;
for (i = 1; i < num; i++)
{
int m = arr[i];
for (j = i - 1; (j >= 0) && (arr[j] > m);j--)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = m;
}
}
int fun(int arr[], int num)
{
int i = 0;
int r = 0, ans = -1;
/*if (arr[0] != 1)
return 1;*/
for (int i = 0;i< num ;i++)
{
int tl = arr[i], tr = r + arr[i];
if (tl <= r + 1)
{
r = tr;
}
else
{
ans = r + 1;
break;
}
}
if (ans == -1) ans = r + 1;
return ans;
}
int main()
{
int *arr = NULL;
int num = 0;
int i = 0;
scanf("%d",&num);
if (num <= 0)
{
printf("input error");
return 0;
}
arr = (int *)malloc(num * sizeof(int));
if (NULL == arr)
{
printf("out of memory\n");
return 0;
}
for (i = 0; i < num; i++)
{
scanf("%d",&arr[i]);
}
sort(arr,num);
int ret = fun(arr, num);
printf("%d",ret);
return 0;
}通过代码,我们发现,如果数组的最小元素不是1,仍然可以通过for循环判断出来,不
需要fun函数中最前边的if判断。
做最好的自己~~加油~
标签:
原文地址:http://blog.csdn.net/peiyao456/article/details/52201968