HDU 1004

自己写的编译通过没问题但是oj的时候一直WA,然后别人的感觉差不多一下就AC了?????心理巨大创伤。。。贴一下我俩代码研究一下 。。。

我的:

#include<iostream>
#include<string.h>
using namespace std;
int main(void){
int n;
char s[1002][16];
int a[1002];
while(scanf("%d",&n)!=EOF){
if(n==0) break;
for(int i=0;i<n;i++){
scanf("%s",s[i]);
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
a[i]=0;
if(strcmp(s[i],s[j])==0) a[i]++;
}
int m=a[0],k=0;
for(int i=0;i<n;i++){
if(m<a[i]){
m=a[i];
k=i;
}
}
printf("%s ",s[k]);


}
return 0;
}

能通过的:

#include <iostream>
#include <string>
using namespace std;
int main()
{
string s[1000]; //定义字符串数组和整型数组
int a[1000];
int n;
while(cin>>n) //输入n表示有n个字符串
{
if(n==0) //当n=0时,表示程序结束
return 0;
for(int i=0;i<n;i++) //输入n个字符串,并把a[i]设为0
{
cin>>s[i];
a[i]=0;
}
for(int i=0;i<n;i++) //双重for循环判断字符串出现次数,并用a[i]来记录
{
for(int j=0;j<n;j++)
{
if(s[i]==s[j])
a[i]++;
}
}
int max=0, k;
for(int i=0;i<n;i++) //设最大值max=0,判断a[i]的最大值即出现最多次,把最大值的下标i赋值给k
{
if(max<a[i])
{
max=a[i];
k=i;


}
} //本来加了一个if(max==1)的判断 即当所有的字符串只出现一次 return 0,结果是错的
cout<<s[k]<<endl;
}


return 0;
}

正在研究中。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

根本不是char s[1000][16]和string s[1000]的问题,也不是s[i]==s[j]还是strcmp(s[i],s[j])==0的问题,也不是数量相等时输出第一个还是最后一个的问题。而是!!!!!!

for(int i=0;i<n;i++){
scanf("%s",s[i]);
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++){
a[i]=0;
if(strcmp(s[i],s[j])==0) a[i]++;
}

而是这里的为a[1000]数组赋初值0应该在第一个for循环,输入的时候赋值0,我的程序里在for for赋值因为是给a[i]赋值,一个a[i]会与所有a[j]比较大小,此时就存在后面的a[j]没赋值的问题,出现程序错误!!!!!1就这么一行困扰了我半天!!!

记得所有的先赋值才能使用!

原文地址:https://www.cnblogs.com/slay/p/10391195.html