网站建设哪好,上行30m可以做网站吗,wordpress 4.7 多站点,扬中网站建设价位题目背景
NOIP2015 普及组 T1
题目描述
国王将金币作为工资#xff0c;发放给忠诚的骑士。第一天#xff0c;骑士收到一枚金币#xff1b;之后两天#xff08;第二天和第三天#xff09;#xff0c;每天收到两枚金币#xff1b;之后三天#xff08;第四、五、六天发放给忠诚的骑士。第一天骑士收到一枚金币之后两天第二天和第三天每天收到两枚金币之后三天第四、五、六天每天收到三枚金币之后四天第七、八、九、十天每天收到四枚金币……这种工资发放模式会一直这样延续下去当连续 n n n 天每天收到 n n n 枚金币后骑士会在之后的连续 n 1 n1 n1 天里每天收到 n 1 n1 n1 枚金币。
请计算在前 k k k 天里骑士一共获得了多少金币。
输入格式
一个正整数 k k k表示发放金币的天数。
输出格式
一个正整数即骑士收到的金币数。
1.题目分析
该题主要考察的是对循环的使用一些数学公式 等差数列求前n项和n*a1 an/2. 这里还可以考虑使用递归。
2.题目思路
写一个递归函数求n*n的前n项和用于计算连续n天后发的总金币数。 键入天数d需要 根据d计算是第n轮发n个金币可以得到他们之间的关系是1 2 3 … n d. 所以可以根据等差数列的前N项公式求得得到N的值后调用递归函数如果恰好不是n轮结束的天数则需要减去多余的金币数。如第4天 1 2 2 3 3 等于 1 2 2 3 3 3 减去 一个3
3.代码实现
#include stdio.h
//写一个函数表示求n*n的前n项和
int res(int n) {if (n 1) {return 1;}return n * n res(n - 1);
}int main() {/*** d,表示天数*/int n, sum, d;n 0;//re表示计算时超出的金币数int re;scanf(%d, d);//判断天数d和第n次发n枚金币之间的关系while (true) {if (n * (n 1) d * 2) {break;}n;}//求总金币数sum res(n);re (n * (n 1) - d * 2) / 2 * n;//总金币数减去超出的printf(%d, sum - re);
}