以下是引用beyondyf在2011-12-21 08:43:11的发言:
呵呵,楼主别介意我的问题。知道你多大我才好判断该从哪个角度和你探讨。
关于你们在使用的模拟问题过程的算法,我不多说什么了,都在把简单的问题往复杂里做。给一个示例对自己比一下。#include
int main()
{
int n, day, k;
printf("Input the number of peaches: ");
scanf("%d", &n);
for(k = 1, day = 0; n > 0; day++)
{
n -= k;
k += 2;
}
printf("%d\n", day);
return 0;
}
现在主要说说这题的数学规律。我忘了什么时候学的等差数列了,初中还是高中?
这题的描述简直就是一个等差数列的定义。只不过现在是已知了前N项和,就项数N而已。
还记得上一贴最后小曹提到的那个公式吗?现在带各位温习一下知识了。
等差数列
第一项为 a1 = 1;
项差为 d = 2;
前N项和为 s = (a1 + a1 + d * (n - 1)) * n / 2 = n * n;
所以 n = sqrt(s)。这里的s就是题中的n,这里的n则是题中的day。
sqrt(s)很多时候不是整数,而是一个小数。这个小数的意义是什么呢?它表示最后剩下的桃子不足以吃一顿,但毕竟也不是前一天能吃完的。
所以最后的结果要对n进行上取整。上一贴中小蔡最后的问题,ceil就是一个上取整函数(准确的说是返回不小于参数的最小整数,在参数为负数时注意这一定义)。
应用这一规律的算法将只有一行代码,效率的差别就不用我说了吧。
你的这个效率简直是非常之快
呵呵,楼主别介意我的问题。知道你多大我才好判断该从哪个角度和你探讨。
关于你们在使用的模拟问题过程的算法,我不多说什么了,都在把简单的问题往复杂里做。给一个示例对自己比一下。#include
int main()
{
int n, day, k;
printf("Input the number of peaches: ");
scanf("%d", &n);
for(k = 1, day = 0; n > 0; day++)
{
n -= k;
k += 2;
}
printf("%d\n", day);
return 0;
}
现在主要说说这题的数学规律。我忘了什么时候学的等差数列了,初中还是高中?
这题的描述简直就是一个等差数列的定义。只不过现在是已知了前N项和,就项数N而已。
还记得上一贴最后小曹提到的那个公式吗?现在带各位温习一下知识了。
等差数列
第一项为 a1 = 1;
项差为 d = 2;
前N项和为 s = (a1 + a1 + d * (n - 1)) * n / 2 = n * n;
所以 n = sqrt(s)。这里的s就是题中的n,这里的n则是题中的day。
sqrt(s)很多时候不是整数,而是一个小数。这个小数的意义是什么呢?它表示最后剩下的桃子不足以吃一顿,但毕竟也不是前一天能吃完的。
所以最后的结果要对n进行上取整。上一贴中小蔡最后的问题,ceil就是一个上取整函数(准确的说是返回不小于参数的最小整数,在参数为负数时注意这一定义)。
应用这一规律的算法将只有一行代码,效率的差别就不用我说了吧。
认为事物非黑即白是缺智慧的表现……