每日一言
我有故人抱剑去,斩尽春风未曾归。 --孤山不孤
牛在客网上,发现了一道有意思的题,想分享一下解题的思路与过程。
题目
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。
请计算在前K天里,骑士一共获得了多少金币。
这道题我有三种解法
法一与法二思路差不多,法三就要思考一下了
法一:
基本思路:一天一天计算总金币数,设置一个变量,当天数到达时跳出循环,这里使用goto语句跳出
#include<stdio.h>
int main()
{
int d = 0;//天数
int sum = 0;//总金币数
int i = 0;
int j = 0;
int a = 0;//用来判断天数是否到了
scanf("%d", &d);
for (i = 1; i <= d; i++)
{
for (j = 1; j <= i; j++)
{
sum += i;//这里是加等i,因为i的值是 1 2 2 3 3 3... 这样变换的.
a++;
if (a == d)
goto v;//跳出双层循环
}
}
v:
printf("%d", sum);
return 0;
}
法二:
基本思路:一天一天计算总金币数,设置一个变量,当天数到达时跳出循环,这里满足k>data跳出
#include<stdio.h>
int main()
{
int data = 0;
int sum = 0;
int k = 1;
scanf("%d",&data);
for(int i = 1;k<=data;i++)
{
for(int j = 0;j<i;j++)
{
if(k>data)
break;
sum+=i;
k++;
}
}
printf("%d",sum);
return 0;
}
法三:
基本思路:将金币数相同的天数看成整体,先计算全部整体的金币数,最后减去超出的金币数,
#include<stdio.h>
int main()
{
int k;
scanf("%d", &k);
int i =1;
int sum = 0;
int cnt = 0;
while(cnt < k)
{
cnt += i;
sum += i*i;
i++;
}
sum -= (i-1) * (cnt - k); //减去超过k的天数
printf("%d", sum);
}
图下面的sum是while循环里的sum。
结语
请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
想成为大佬那就保持空杯心态加油努力吧!
都看到这里啦!真棒(*^▽^*)
可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家
编程小白写作,如有纰漏或错误,欢迎指正