鱼C论坛

 找回密码
 立即注册
查看: 2154|回复: 6

[已解决]请问这道题为什么会出现异常值

[复制链接]
发表于 2022-8-1 10:40:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
屏幕截图 2022-08-01 103634.jpg
如图,这段代码输出的第一个值出现了异常,经排查,发现是下面代码中days数组的days[0][2]出现了异常,我感觉是溢出,但是找不到溢出原因

我的代码:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
        int n, m, k; cin>>n>>m>>k;
        int days[k][m] = {0};
        for(int i=0; i<n; ++i)
        {
                for(int j=0; j<m; ++j)
                {
                        int temp; cin>>temp;
                        days[temp-1][j] = 1;        //记录第temp天时,教练需要准备第j套模拟题 
                }
        }
        for(int i=0; i<k; ++i)
        {
                int sum = 0;
                for(int j=0; j<m; ++j)
                {
                        sum += days[i][j];        //计算第i天时,教练需要准备的模拟题数量 
                        //cout<<i<<" "<<j<<" "<<days[i][j]<<endl;
                }
                cout<<sum<<" "/*<<endl*/;
        }
        return 0;
}
题目地址
最佳答案
2022-8-1 11:30:21
本帖最后由 柿子饼同学 于 2022-8-1 11:37 编辑
柿子饼同学 发表于 2022-8-1 11:17
首先贴下我的代码, 这题用 set 去重的特性很好做
然后你的数组不能这么定义 , 类似 XXX[m][n] , m 和 n 要 ...


帮你把代码改好了, 可用过
哦对, 忘了说, days 反正只有 0 和 1, 可用直接用 bool 省空间 , 下面循环的时候判断是否为 1 , 再加即可
#include <bits/stdc++.h>
using namespace std;

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

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

    cin >> n >> m >> k;

    //int days[k][m] = {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[temp][j] = 1;        //记录第temp天时,教练需要准备第j套模拟题 
        }
    }
    for(int i = 1; i <= k; i++){
        int sum = 0;
        for(int j = 1; j <= m; j++){
            sum += days[i][j];        //计算第i天时,教练需要准备的模拟题数量 
            //cout<<i<<" "<<j<<" "<<days[i][j]<<endl;
        }
        cout<<sum<<" "/*<<endl*/;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-1 11:17:05 | 显示全部楼层
本帖最后由 柿子饼同学 于 2022-8-1 11:31 编辑

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

set<int> date[1005];
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[temp].insert(j);
        }
    }

    for(int i = 1; i <= k; i++){
        cout << date[i].size() << ' ';
    }
    
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-1 11:30:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 柿子饼同学 于 2022-8-1 11:37 编辑
柿子饼同学 发表于 2022-8-1 11:17
首先贴下我的代码, 这题用 set 去重的特性很好做
然后你的数组不能这么定义 , 类似 XXX[m][n] , m 和 n 要 ...


帮你把代码改好了, 可用过
哦对, 忘了说, days 反正只有 0 和 1, 可用直接用 bool 省空间 , 下面循环的时候判断是否为 1 , 再加即可
#include <bits/stdc++.h>
using namespace std;

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

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

    cin >> n >> m >> k;

    //int days[k][m] = {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[temp][j] = 1;        //记录第temp天时,教练需要准备第j套模拟题 
        }
    }
    for(int i = 1; i <= k; i++){
        int sum = 0;
        for(int j = 1; j <= m; j++){
            sum += days[i][j];        //计算第i天时,教练需要准备的模拟题数量 
            //cout<<i<<" "<<j<<" "<<days[i][j]<<endl;
        }
        cout<<sum<<" "/*<<endl*/;
    }
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么m和n要接受的话就不能这么写呢(我之前的代码都是这么写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

还有,这样初始化不是可以的么
屏幕截图 2022-08-01 113836.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

啊这 , 行吧 , 是可以的
但是最好提前开好 , 这样不是什么好习惯
你如果要节省空间, 用可变长度的数组 (vector 之类的)
普通数组就是要一个方便 , 你这样越界也很难排查到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-1 12:13:42 | 显示全部楼层
tommyyu 发表于 2022-8-1 11:41
还有,这样初始化不是可以的么


好吧 好吧
但是不建议这样搞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 20:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表