前言
简单问题,写的不好,大佬见谅.
如有疏漏,恳请指正,小编垂首.
问题描述:
某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。 现在算起来,他一共吹熄了236根蜡烛。 请问,他从多少岁开始过生日party的? 请填写他开始过生日party的年龄数。
问题解析:
- 遍历从1开始最高到200吧(应该不会有人能活到这个岁数,目前为止)
- n=236,i=1,j=1
- 类似于在1->200的数组中的滑动窗口,循环累加 sum+=i;
- if(sum>n)//说明开始的岁数小了,sum-=j; j++;
- if(sum<n)//说明结束的岁数小了,sum+i;
- sum==n时,输出j
暴力法的话,等差数列前n项和也ok
实现代码:
代码如下(示例):
#include<iostream>
using namespace std;
int result(int n) {//相当于在滑动窗口
int sum = 0, i = 1, j = 1;
while (i < 200) {
if (sum < n) {
sum += i;
i++;
}
else if (sum > n) {
sum -= j;
j++;
}
else return j;
}
}
//int result(int n) {//前n项和
// for (int i = 1; i < 200; i++) {
// for (int j = i+1; j < 200; j++) {
// if ((i + j) * (j - i + 1) == n * 2)
// return i;
// }
// }
//}
int main() {
int n;
cin >> n;
cout << result(n) << endl;
return 0;
}
测试案例:
总结
所以为什么搜到的都是暴力累加,不行就归零,
明明等差数列公式也很好用