标签:
题目描述如下:
看到这个题目,最容易想到的是暴力搜索法。然而,那不是好的办法,也是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