knight_15 2023-11-19 08:30 采纳率: 90.9%
浏览 31
已结题

c语言课前不预习问题


#include<stdio.h>
int main()
{
    int N, n, m, i, t, l, s = 0, s1 = 0;
    scanf("%d", &N);
 
    for (i = 1; i <= N; i++)
    {
        scanf("%d", &n);
        for (l = 1; l <= n; l++)
        {
            scanf("%d %d", &m, &t);
            if (m == 0) s = 0;
            else    s = m + (t - 1) * 20;
            s1 += s;
        }
    }
 
    printf("%d", s1);
    return 0;
}

```为什么这段代码在校园oj平台上运行结果依然错误
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/262877353007140.png "#left")
  • 写回答

4条回答 默认 最新

  • K_n_i_g_h_t_1990 2023-11-20 10:44
    关注

    在你的代码中,内层的 for 循环中有一句 if (m == 0) s = 0;,这意味着如果 m 的值为0,s 的值将被设为0。然而,这样的设置会影响到后续的循环,导致 s1 的计算结果出现错误。具体来说,s1 是一个累加变量,而在内层循环中的 if (m == 0) s = 0; 语句会影响到 s 的值,从而影响到 s1 的累加。

    解决方法是在每一轮循环开始前将 s 的值初始化为0,以确保 s 的值不受上一次循环的影响。修改代码如下:

    #include <stdio.h>
    
    int main() {
        int N, n, m, i, t, l, s = 0, s1 = 0;
        scanf("%d", &N);
    
        for (i = 1; i <= N; i++) {
            scanf("%d", &n);
            for (l = 1; l <= n; l++) {
                // 在每一轮循环开始前将 s 初始化为 0
                s = 0;
                scanf("%d %d", &m, &t);
                if (m != 0) {
                    s = m + (t - 1) * 20;
                }
                s1 += s;
            }
        }
    
        printf("%d", s1);
        return 0;
    }
    
    
    

    这样修改后,每一轮内层循环开始前,s 的值都被初始化为0,不再受到上一次循环的影响,从而能够正确计算 s1。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月28日
  • 已采纳回答 11月20日
  • 创建了问题 11月19日

悬赏问题

  • ¥15 岛津txt格式文件转nirs格式
  • ¥15 石墨烯磁表面等离子体
  • ¥15 angular 项目无法启动
  • ¥15 安装wampserver,图标绿色,但是无法进入软件
  • ¥15 C++ MFC 标准库 加密解密解惑
  • ¥15 两条数据合并成一条数据
  • ¥15 Ubuntu虚拟机设置
  • ¥15 comsol三维模型中磁场为什么没有“速度(洛伦兹项)”这一选项
  • ¥15 electron 如何实现自定义安装界面
  • ¥15 关于#linux#的问题:子进程C运行“ls –l”命令,且显示“C运行ls-l命令”(语言-c语言)