鱼C论坛

 找回密码
 立即注册
查看: 1209|回复: 3

[已解决]修改代码

[复制链接]
发表于 2023-10-24 22:41:22 | 显示全部楼层 |阅读模式

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

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

x
#include <bits/stdc++.h>
using namespace std;
const int N =1010;
int a[N],b[N];
int main()
{
    int n,cnt=0;
    cin>>n;
    memset(b,0,sizeof(b));
    for(int i=0;i<n;i++)cin>>a[i];
    for(int j=0;j<n;j++)
    {
        b[a[j]]++;
    }
    for(int j=0;j<n;j++)
    {
        if(b[a[j]]==0)cnt++;
    }
     cout<<cnt<<endl;
}
为什么输出cnt会等于0,而不等于4
最佳答案
2023-10-26 10:26:33
你的代码逻辑是这样的:

输入一个整数 n。
输入 n 个整数到数组 a。
将数组 b 全部初始化为0。
遍历 a,对于 a 中的每一个元素 a[j],增加 b[a[j]] 的值。
再次遍历 a,对于 a 中的每一个元素 a[j],如果 b[a[j]] 的值为0,则增加 cnt 的值。
输出 cnt 的值。
现在的问题是,你发现 cnt 的值总是0,而不是你预期的4。

这个问题的原因在于,你的程序只读入了 n 个整数,然后试图在 b 中找到对应的索引并增加其值。但是,你在第4步中并没有将 b[a[j]] 的值增加1,而是直接将 a[j] 的值存储到了 b 中。因此,即使你在第5步中检查到 b[a[j]] 的值为0,也无法增加 cnt 的值,因为 b[a[j]] 的值并不是你所期望的索引。

要解决这个问题,你需要在第4步中修改 b[a[j]] 的值,而不是将 a[j] 的值存储到 b 中。这样,当你在第5步中检查到 b[a[j]] 的值为0时,就可以正确地增加 cnt 的值了。

以下是修改后的代码:
#include <bits/stdc++.h>
using namespace std;
const int N =1010;
int a[N],b[N];
int main()
{
    int n,cnt=0;
    cin>>n;
    memset(b,0,sizeof(b));
    for(int i=0;i<n;i++)cin>>a[i];
    for(int j=0;j<n;j++)
    {
        b[a[j]]++;
    }
    for(int j=0;j<n;j++)
    {
        if(b[a[j]]==1)cnt++;
    }
     cout<<cnt<<endl;
}
在这个修改后的代码中,我们将 b[a[j]] 的值从0修改为1,这样在检查到 b[a[j]] 的值为1时,就可以正确地增加 cnt 的值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-24 22:41:46 | 显示全部楼层
问题出在第一个for循环中的 memset(b,0,sizeof(b)); 这一行代码上。这行代码将数组b的所有元素都设置为0。由于数组b的初始值都是0,所以在第二个for循环中,当 b[a[j]]++ 执行时,b数组中对应a[j]的元素会自增1。但是在第三个for循环中,当判断 b[a[j]]==0 时,由于第二个for循环的操作,b数组中对应a[j]的元素已经大于0,所以条件不满足,cnt不会自增。因此,输出的cnt始终为0。

要解决这个问题,可以将第一个for循环中的 memset(b,0,sizeof(b)); 这一行代码删除。这样,数组b的初始值就是未定义的,而不是都为0。这样,在第三个for循环中,当判断 b[a[j]]==0 时,如果b数组中对应a[j]的元素为0,则cnt自增。这样就能得到正确的cnt值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-24 22:41:56 | 显示全部楼层
根据给定的代码,输出cnt等于0的原因是在第一个循环中,数组b被初始化为全零。而在第二个循环中,对每个元素a[j],如果b[a[j]]等于0,就会将cnt加一。由于b数组一开始全为零,所以对于任意的j,都有b[a[j]]等于0,导致cnt始终为n,即等于0。

可能的修改如下:
#include <iostream>
#include <vector>
using namespace std;

const int N = 1010;

int main() {
    int n;
    cin >> n;

    vector<int> a(n);
    vector<int> b(N, 0);

    for (int i = 0; i < n; i++) {
        cin >> a[ i];
        b[a[ i]]++;
    }

    int cnt = 0;
    for (int j = 0; j < N; j++) {
        if (b[j] == 0)
            cnt++;
    }

    cout << cnt << endl;

    return 0;
}

这个修改使用了vector代替数组,并将b初始化为全零。然后在第一个循环中,将计数操作放在读取输入的同时进行。接着在第二个循环中,遍历b数组的所有元素,统计为零的个数,从而得到正确的cnt值。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-26 10:26:33 | 显示全部楼层    本楼为最佳答案   
你的代码逻辑是这样的:

输入一个整数 n。
输入 n 个整数到数组 a。
将数组 b 全部初始化为0。
遍历 a,对于 a 中的每一个元素 a[j],增加 b[a[j]] 的值。
再次遍历 a,对于 a 中的每一个元素 a[j],如果 b[a[j]] 的值为0,则增加 cnt 的值。
输出 cnt 的值。
现在的问题是,你发现 cnt 的值总是0,而不是你预期的4。

这个问题的原因在于,你的程序只读入了 n 个整数,然后试图在 b 中找到对应的索引并增加其值。但是,你在第4步中并没有将 b[a[j]] 的值增加1,而是直接将 a[j] 的值存储到了 b 中。因此,即使你在第5步中检查到 b[a[j]] 的值为0,也无法增加 cnt 的值,因为 b[a[j]] 的值并不是你所期望的索引。

要解决这个问题,你需要在第4步中修改 b[a[j]] 的值,而不是将 a[j] 的值存储到 b 中。这样,当你在第5步中检查到 b[a[j]] 的值为0时,就可以正确地增加 cnt 的值了。

以下是修改后的代码:
#include <bits/stdc++.h>
using namespace std;
const int N =1010;
int a[N],b[N];
int main()
{
    int n,cnt=0;
    cin>>n;
    memset(b,0,sizeof(b));
    for(int i=0;i<n;i++)cin>>a[i];
    for(int j=0;j<n;j++)
    {
        b[a[j]]++;
    }
    for(int j=0;j<n;j++)
    {
        if(b[a[j]]==1)cnt++;
    }
     cout<<cnt<<endl;
}
在这个修改后的代码中,我们将 b[a[j]] 的值从0修改为1,这样在检查到 b[a[j]] 的值为1时,就可以正确地增加 cnt 的值了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-17 04:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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