tommyyu 发表于 2022-8-1 10:40:07

请问这道题为什么会出现异常值


如图,这段代码输出的第一个值出现了异常,经排查,发现是下面代码中days数组的days出现了异常,我感觉是溢出,但是找不到溢出原因

我的代码:#include<iostream>
#include<cstring>
using namespace std;
int main()
{
        int n, m, k; cin>>n>>m>>k;
        int days = {0};
        for(int i=0; i<n; ++i)
        {
                for(int j=0; j<m; ++j)
                {
                        int temp; cin>>temp;
                        days = 1;      //记录第temp天时,教练需要准备第j套模拟题
                }
        }
        for(int i=0; i<k; ++i)
        {
                int sum = 0;
                for(int j=0; j<m; ++j)
                {
                        sum += days;      //计算第i天时,教练需要准备的模拟题数量
                        //cout<<i<<" "<<j<<" "<<days<<endl;
                }
                cout<<sum<<" "/*<<endl*/;
        }
        return 0;
}
题目地址

柿子饼同学 发表于 2022-8-1 11:17:05

本帖最后由 柿子饼同学 于 2022-8-1 11:31 编辑

首先贴下我的代码, 这题用 set 去重的特性很好做
然后你的数组不能这么定义 , 类似 XXX , m 和 n 要接收的这种定义是不合法的
建议常用的变量定义全局变量 , 并且你的 = {0} 只有第一个元素被赋值为 0 , 其他都没初始化
可以用memset
异常值是因为没有定义 , 会出现随机的数
#include <bits/stdc++.h>
using namespace std;

set<int> date;
int n, m, k, temp;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
   
    cin >> n >> m >> k;

    for(int i = 1; i <= n; i++){
      for(int j = 1; j <= m; j++){
            cin >> temp;
            date.insert(j);
      }
    }

    for(int i = 1; i <= k; i++){
      cout << date.size() << ' ';
    }
   
    return 0;
}

柿子饼同学 发表于 2022-8-1 11:30:21

本帖最后由 柿子饼同学 于 2022-8-1 11:37 编辑

柿子饼同学 发表于 2022-8-1 11:17
首先贴下我的代码, 这题用 set 去重的特性很好做
然后你的数组不能这么定义 , 类似 XXX , m 和 n 要 ...

帮你把代码改好了, 可用过
哦对, 忘了说, days 反正只有 0 和 1, 可用直接用 bool 省空间 , 下面循环的时候判断是否为 1 , 再加即可

#include <bits/stdc++.h>
using namespace std;

int n, m, k;
int days; //全局变量自动设为 0

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> n >> m >> k;

    //int days = {0}; 这样定义不对
    //memset(days, 0, sizeof(days)); 如果要用局部变量, 可用 memset , 这条语句意思是把 days 所有元素设为 0
    //注意, memset 是用字节的方法填充的, 所以建议只在第二个参数中填 0, -1, 1, 0x3f 等一个字节的

    for(int i = 1; i <= n; i++){
      for(int j = 1; j <= m; j++){
            int temp;
            cin >> temp;
            days = 1;      //记录第temp天时,教练需要准备第j套模拟题
      }
    }
    for(int i = 1; i <= k; i++){
      int sum = 0;
      for(int j = 1; j <= m; j++){
            sum += days;      //计算第i天时,教练需要准备的模拟题数量
            //cout<<i<<" "<<j<<" "<<days<<endl;
      }
      cout<<sum<<" "/*<<endl*/;
    }
    return 0;
}

tommyyu 发表于 2022-8-1 11:39:36

柿子饼同学 发表于 2022-8-1 11:17
首先贴下我的代码, 这题用 set 去重的特性很好做
然后你的数组不能这么定义 , 类似 XXX , m 和 n 要 ...

为什么m和n要接受的话就不能这么写呢(我之前的代码都是这么写的{:10_263:})

tommyyu 发表于 2022-8-1 11:41:46

柿子饼同学 发表于 2022-8-1 11:30
帮你把代码改好了, 可用过
哦对, 忘了说, days 反正只有 0 和 1, 可用直接用 bool 省空间 , 下面循环 ...

还有,这样初始化不是可以的么

柿子饼同学 发表于 2022-8-1 12:12:16

tommyyu 发表于 2022-8-1 11:39
为什么m和n要接受的话就不能这么写呢(我之前的代码都是这么写的)

啊这 , 行吧 , 是可以的
但是最好提前开好 , 这样不是什么好习惯
你如果要节省空间, 用可变长度的数组 (vector 之类的)
普通数组就是要一个方便 , 你这样越界也很难排查到

柿子饼同学 发表于 2022-8-1 12:13:42

tommyyu 发表于 2022-8-1 11:41
还有,这样初始化不是可以的么

好吧 好吧
但是不建议这样搞
页: [1]
查看完整版本: 请问这道题为什么会出现异常值