鱼C论坛

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

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

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

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

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

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

我的代码:
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. int main()
  5. {
  6.         int n, m, k; cin>>n>>m>>k;
  7.         int days[k][m] = {0};
  8.         for(int i=0; i<n; ++i)
  9.         {
  10.                 for(int j=0; j<m; ++j)
  11.                 {
  12.                         int temp; cin>>temp;
  13.                         days[temp-1][j] = 1;        //记录第temp天时,教练需要准备第j套模拟题
  14.                 }
  15.         }
  16.         for(int i=0; i<k; ++i)
  17.         {
  18.                 int sum = 0;
  19.                 for(int j=0; j<m; ++j)
  20.                 {
  21.                         sum += days[i][j];        //计算第i天时,教练需要准备的模拟题数量
  22.                         //cout<<i<<" "<<j<<" "<<days[i][j]<<endl;
  23.                 }
  24.                 cout<<sum<<" "/*<<endl*/;
  25.         }
  26.         return 0;
  27. }
复制代码

题目地址
最佳答案
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 , 再加即可

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

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

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

  8.     cin >> n >> m >> k;

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

  12.     for(int i = 1; i <= n; i++){
  13.         for(int j = 1; j <= m; j++){
  14.             int temp;
  15.             cin >> temp;
  16.             days[temp][j] = 1;        //记录第temp天时,教练需要准备第j套模拟题
  17.         }
  18.     }
  19.     for(int i = 1; i <= k; i++){
  20.         int sum = 0;
  21.         for(int j = 1; j <= m; j++){
  22.             sum += days[i][j];        //计算第i天时,教练需要准备的模拟题数量
  23.             //cout<<i<<" "<<j<<" "<<days[i][j]<<endl;
  24.         }
  25.         cout<<sum<<" "/*<<endl*/;
  26.     }
  27.     return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  3. set<int> date[1005];
  4. int n, m, k, temp;

  5. int main(){
  6.     ios::sync_with_stdio(0);
  7.     cin.tie(0); cout.tie(0);
  8.    
  9.     cin >> n >> m >> k;

  10.     for(int i = 1; i <= n; i++){
  11.         for(int j = 1; j <= m; j++){
  12.             cin >> temp;
  13.             date[temp].insert(j);
  14.         }
  15.     }

  16.     for(int i = 1; i <= k; i++){
  17.         cout << date[i].size() << ' ';
  18.     }
  19.    
  20.     return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://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 , 再加即可

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

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

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

  8.     cin >> n >> m >> k;

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

  12.     for(int i = 1; i <= n; i++){
  13.         for(int j = 1; j <= m; j++){
  14.             int temp;
  15.             cin >> temp;
  16.             days[temp][j] = 1;        //记录第temp天时,教练需要准备第j套模拟题
  17.         }
  18.     }
  19.     for(int i = 1; i <= k; i++){
  20.         int sum = 0;
  21.         for(int j = 1; j <= m; j++){
  22.             sum += days[i][j];        //计算第i天时,教练需要准备的模拟题数量
  23.             //cout<<i<<" "<<j<<" "<<days[i][j]<<endl;
  24.         }
  25.         cout<<sum<<" "/*<<endl*/;
  26.     }
  27.     return 0;
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

为什么m和n要接受的话就不能这么写呢(我之前的代码都是这么写的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

还有,这样初始化不是可以的么
屏幕截图 2022-08-01 113836.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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


好吧 好吧
但是不建议这样搞
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-17 12:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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