| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 478 人关注过本帖
标题:hdoj1004Runtime Error (ACCESS_VIOLATION) 求指导 谢谢
只看楼主 加入收藏
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:6 
hdoj1004Runtime 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;
    
    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;
}
2012-11-20 15:34
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
还要让每个看贴的人先去Google一下hdoj1004是什么呀?

我没仔细看,但觉得 max 就不对,每次循环只能往上增。应该在for (int j=1; j<m; j++)前加上max=0
前面那个
else
                    {
                        strcpy(color[m],temp);
                        m++;
                    }
看起来也不对,起码要加个break;
2012-11-20 16:44
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
收藏
得分:0 
回复 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;
}

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-11-21 09:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
我不会做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
2012-11-21 11:04
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
收藏
得分:0 
回复 4楼 rjsp
感谢版主  学习了

您写的很简洁 学习了

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-11-21 11:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 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来比较
2012-11-21 11:59
mmmmmmmmmmmm
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:8
帖 子:388
专家分:1809
注 册:2012-11-2
收藏
得分:0 
太感谢 又扩展了知识 谢谢


以下是引用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来比较

我们的目标只有一个:消灭0回复!
while(1)
++money;
2012-11-21 13:22
快速回复:hdoj1004Runtime Error (ACCESS_VIOLATION) 求指导 谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054260 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved