注册 登录
编程论坛 C++教室

hdoj1004Runtime Error (ACCESS_VIOLATION) 求指导 谢谢

mmmmmmmmmmmm 发布于 2012-11-20 15:34, 478 次点击
程序代码:
#include <iostream>
using namespace std;

int main(void)
{
    char color[1000][16];
    char temp[16];
    int num[1000];
    int n=0,m=0,max=0;
   
    while (cin>>n && n!=0)
    {
        memset(num,0,1000);
        m=0;
        for (int i=0; i<n; i++)
        {
            if(i == 0)
            {
                cin>>color[i];
                ++m;
            }
            else
            {
                cin>>temp;
                for (int i=0; i<m; i++)
                {
                    if (strcmp(color[i],temp) == 0)
                        num[i]++;
                    else
                    {
                        strcpy(color[m],temp);
                        m++;
                    }
                }
            }
        }
        
        for (int j=1; j<m; j++)
        {
            if(num[max] < num[j])
                max=j;
        }
        cout<<color[max]<<endl;
    }
   
    return 0;
}
6 回复
#2
rjsp2012-11-20 16:44
还要让每个看贴的人先去Google一下hdoj1004是什么呀?

我没仔细看,但觉得 max 就不对,每次循环只能往上增。应该在for (int j=1; j<m; j++)前加上max=0
前面那个
else
                    {
                        strcpy(color[m],temp);
                        m++;
                    }
看起来也不对,起码要加个break;
#3
mmmmmmmmmmmm2012-11-21 09:52
回复 2楼 rjsp
题目在这里  http://acm.hdu.

大意是;计算输入的气球颜色种类次数,输出最多的颜色。

代码重新完善了一下 提交还是Runtime Error(ACCESS_VIOLATION)

麻烦版主帮忙看看 谢谢

程序代码:
#include <iostream>
using namespace std;

int main(void)
{
    char color[1000][16];//记录气球颜色
    char temp[16];
    int num[1000];//记录气球某种颜色的次数
    int n=0,m=0,max=0;//m记录颜色种类
   
    while (cin>>n && n!=0)
    {
        memset(num,0,1000);//初始化
        m=0;
        for (int i=0; i<n; i++)
        {
            if(i == 0)//第一种颜色直接存取
            {
                cin >> color[i];
                ++m;
            }
            else//判断每次输入的颜色是否和前面相同
            {
                cin>>temp;
                for (int i=0; i<m; i++)
                {
                    if (strcmp(color[i],temp) == 0)//如果颜色相同 不记录颜色 但次数加1
                        num[i]++;
                    else
                    {
                        strcpy(color[m],temp);//如果颜色不同 就记录 颜色种类加1
                        m++;
                    }
                }
            }
        }
        max=0;
        for (int j=1; j<m; j++)//查找颜色最多的一种输出
        {
            if(num[max] < num[j])
                max=j;
        }
        cout<<color[max]<<endl;
    }
   
    return 0;
}
#4
rjsp2012-11-21 11:04
我不会做ACM,因为它对输出是有格式要求的
程序代码:
#include <iostream>
using namespace std;

int main(void)
{
    for( size_t n; cin>>n && n!=0; )
    {
        char color[1000][16]; // 记录气球颜色
        size_t num[1000] = { 0 }; // 记录气球某种颜色的次数
        size_t m = 0; // m记录颜色种类

        for( size_t i=0; i<n; ++i )
        {
            char temp[16];
            cin >> temp;

            size_t index = 0;
            for( ; index<m; ++index )
            {
                if( strcmp(color[index],temp) == 0 ) // 如果颜色相同
                    break;
            }
            if( index < m )
                ++num[index];
            else
                strcpy(color[m++],temp);
        }

        size_t index = 0;
        for( size_t i=0; i<m; ++i ) //查找颜色最多的一种输出
        {
            if( num[index] < num[i] )
                index = i;
        }
        cout << color[index] << endl;
    }

    return 0;
}
输入
5
green
red
blue
red
red
3
pink
orange
pink
0
输出
read
pink
#5
mmmmmmmmmmmm2012-11-21 11:42
回复 4楼 rjsp
感谢版主  学习了

您写的很简洁 学习了
#6
rjsp2012-11-21 11:59
回复 5楼 mmmmmmmmmmmm
如果要简洁的话,直接用 std::map
程序代码:
#include <map>
#include <string>
using namespace std;

int main(void)
{
    for( size_t n; cin>>n && n!=0; )
    {
        map<string,size_t> colors;

        for( size_t i=0; i<n; ++i )
        {
            string color;
            cin >> color;

            ++colors[color];
        }

        map<string,size_t>::const_iterator index = colors.begin();
        for( map<string,size_t>::const_iterator itor=colors.begin(); itor!=colors.end(); ++itor )
        {
            if( index->second < itor->second )
                index = itor;
        }
        cout << index->first << endl;
    }

    return 0;
}

如果要运行效率的话,用堆排序(std::make_heap)比较好,因为堆顶就是数量最大的那个元素
其次,strcmp也可以优化掉,因为只有16个字节,可以当成两个8字节的long long来比较
#7
mmmmmmmmmmmm2012-11-21 13:22
太感谢 又扩展了知识 谢谢


以下是引用rjsp在2012-11-21 11:59:44的发言:

如果要简洁的话,直接用 std::map
#include <map>
#include <string>
using namespace std;

int main(void)
{
    for( size_t n; cin>>n && n!=0; )
    {
        map<string,size_t> colors;

        for( size_t i=0; i<n; ++i )
        {
            string color;
            cin >> color;

            ++colors;
        }

        map<string,size_t>::const_iterator index = colors.begin();
        for( map<string,size_t>::const_iterator itor=colors.begin(); itor!=colors.end(); ++itor )
        {
            if( index->second < itor->second )
                index = itor;
        }
        cout << index->first << endl;
    }

    return 0;
}
如果要运行效率的话,用堆排序(std::make_heap)比较好,因为堆顶就是数量最大的那个元素
其次,strcmp也可以优化掉,因为只有16个字节,可以当成两个8字节的long long来比较
1