牛客网刷题 | BC96 [NOIP2015]金币

目前主要分为三个专栏,后续还会添加:

        专栏如下:                 C语言刷题解析       C语言系列文章       我的成长经历

感谢阅读!

初来乍到,如有错误请指出,感谢!


 描述

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。

请计算在前K天里,骑士一共获得了多少金币。

输入描述:

输入只有1行,包含一个正整数K,表示发放金币的天数。

输出描述:

输出只有1行,包含一个正整数,即骑士收到的金币数。


思路 : 

用两层for循环 一层控制天数 一层控制金币的数

想了半天没想出来,后来看了下解析

还需要加一个过去的天数,不然怎么加上去

还需多练......




代码 1 :

/*思路 : 用两层for循环 一层控制天数 一层控制金币的数
        */

#include <stdio.h> // 包含标准输入输出库

int main() // 主函数入口
{
    int day = 0; // 总共过去的天数,用于存储用户输入的天数
    int GoldSum = 0; // 求和,用于累加总共收到的金币数
    int PastDay = 0; // 过去的天数,实际已经过去的天数

    scanf("%d", &day); // 从标准输入读取一个整数,存储到变量day中

    // 外循环控制天数,i代表当前是第几天
    for (int i = 1; PastDay < day; i++)
    {
        // 内循环控制金币,j用于计数内循环的迭代次数
        for (int j = 0; j < i; j++)
        {
            // 累加金币,每次内循环迭代,GoldSum增加当前天数i的金币数
            GoldSum = i + GoldSum; // 这里存在逻辑错误,正确的应该是 GoldSum += i;
            PastDay++; // 过去的天数增加一天
            // 当过去的天数和总共所给的天数相同时跳出循环,但这里的逻辑有误
            if (PastDay == day) // 这里的条件判断是错误的,应该放在内循环的外面
            {
                break;
            }
        }
    }
    printf("%d\n", GoldSum); // 输出骑士总共收到的金币数
    return 0; // 程序正常结束
}

代码 2 :

#include<stdio.h> // 包含标准输入输出库,用于输入输出操作

int main() // 主函数,程序的入口点
{
    int k=0, Pay=0, j=0, sum=0, tmp=0; // 定义变量
    // k: 发放金币的天数
    // Pay: 当前每天收到的金币数
    // j: 已经过去的天数
    // sum: 骑士总共收到的金币数
    // tmp: 记录每次金币数增加时的天数

    scanf("%d",&k); // 从标准输入读取一个整数,存储到变量k中,表示发放金币的天数

    for(int i = 1; i <= k; i++) // 循环k天
    {
        if(i == tmp + j || i == 1) // 如果当前天数i等于tmp加上已经过去的天数j(即新的周期开始),或者i等于1(表示第一天)
        {
            tmp = i; // 更新tmp为当前天数i,表示新的周期开始
            Pay++; // Pay增加,因为每天收到的金币数在增加
            j = 0; // 重置j为0,因为新的周期开始,过去的天数从0开始计算
        }
        sum += Pay; // 将当前每天收到的金币数Pay加到总金币数sum上
    }
    printf("%d\n", sum); // 输出骑士总共收到的金币数
    return 0; // 程序正常结束,返回0表示成功
}

代码 3 :

#include <stdio.h>

int main() {
    int day,coin=1,sum=0,n,past=0;
    scanf("%d",&n);
    for(day=1;day<=n;day++)
    {
        past++;
        sum+=coin;
        if(past==coin)
        {
            past=0;
            coin++;
        }
    }
    printf("%d",sum);
    return 0;
}

扩展 : 嵌套循环

以下内容来自 C 嵌套循环 | 菜鸟教程 (runoob.com)

语法

C 语言中 嵌套 for 循环 语句的语法:

for (initialization; condition; increment/decrement)
{
    statement(s);
    for (initialization; condition; increment/decrement)
    {
        statement(s);
        ... ... ...
    }
    ... ... ...
}

流程图:

C 语言中 嵌套 while 循环 语句的语法:

while (condition1)
{
    statement(s);
    while (condition2)
    {
        statement(s);
        ... ... ...
    }
    ... ... ...
}

流程图:

C 语言中 嵌套 do...while 循环 语句的语法:

do
{
    statement(s);
    do
    {
        statement(s);
        ... ... ...
    }while (condition2);
    ... ... ...
}while (condition1);

关于嵌套循环有一点值得注意,您可以在任何类型的循环内嵌套其他任何类型的循环。比如,一个 for 循环可以嵌套在一个 while 循环内,反之亦然。

实例

下面的程序使用了一个嵌套的 for 循环来查找 2 到 100 中的质数:

for循环实例

#include <stdio.h>
 
int main ()
{
   /* 局部变量定义 */
   int i, j;
   
   for(i=2; i<100; i++) {
      for(j=2; j <= (i/j); j++)
        if(!(i%j)) break; // 如果找到,则不是质数
      if(j > (i/j)) printf("%d 是质数\n", i);
   }
 
   return 0;
}
2 是质数
3 是质数
5 是质数
7 是质数
11 是质数
13 是质数
17 是质数
19 是质数
23 是质数
29 是质数
31 是质数
37 是质数
41 是质数
43 是质数
47 是质数
53 是质数
59 是质数
61 是质数
67 是质数
71 是质数
73 是质数
79 是质数
83 是质数
89 是质数
97 是质数

while 嵌套实例

#include <stdio.h>
int main()
{
    int i=1,j;
    while (i <= 5)
    {
        j=1;
        while (j <= i )
        {
            printf("%d ",j);
            j++;
        }
        printf("\n");
        i++;
    }
    return 0;
}
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

do-while 嵌套实例

#include <stdio.h>
int main()
{
    int i=1,j;
    do
    {
        j=1;
        do
        {
            printf("*");
            j++;
        }while(j <= i);
        i++;
        printf("\n");
    }while(i <= 5);
    return 0;
}
*
**
***
****
*****

  

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值