北大acm1002题 运行结果总是超时,怎么改,程序有点乱,有心的人希望看看,帮帮忙,,谢谢了,
#include<iostream>usingnamespacestd;#include<string>intmain(){intn,i,j=0,k,x=0,b;inta...
#include<iostream>
using namespace std;
#include<string>
int main(){
int n,i,j=0,k,x=0,b;
int a[7];
string str;
cin>>n;
int **p;
p=new int*[n];
for(i=0;i<n;i++){
p[i]=new int[7];
}
for(i=0;i<n;i++){
cin>>str;
for(k=0;k<str.size();k++)
{ if((str[k]=='-')||(str[k]=='Q')||(str[k]=='Z')) continue;//将输入的字符串储存到数组中,当遇到“-”号时跳过
else if((str[k]>='A')&(str[k]<='C'))
p[i][j]=2;
else if((str[k]>='D')&(str[k]<='F'))
p[i][j]=3;
else if((str[k]>='G')&(str[k]<='I'))
p[i][j]=4;
else if((str[k]>='J')&(str[k]<='L'))
p[i][j]=5;
else if((str[k]>='M')&(str[k]<='O'))
p[i][j]=6;
else if((str[k]>='P')&(str[k]<='S'))
p[i][j]=7;
else if((str[k]>='T')&(str[k]<='V'))
p[i][j]=8;
else if((str[k]>='W')&(str[k]<='Y'))
p[i][j]=9;
else if(str[k]=='1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0')
p[i][j]=(int)(str[k]-'0');
j++;}
j=0;
}
for(i=0;i<n-1;i++){
b=i+1;
for(j=0;j<n-x-1;j++){
if(p[i][0]>p[b][0]){
for(int s=0;s<7;s++){
a[s]=p[b][s];
p[b][s]=p[i][s];
p[i][s]=a[s]; //将转换成标准形式的数组按首位数字的大小从小到大排列
}
}
b++;
} x++;
}
x=0,b=0;
int count=0,l,sum=1,c,z=0;//以下是检索相同的号码
for(c=0;c<n-1;c++){
l=b+1;
for(k=0;k<n-x-1;k++){
for(j=0;j<7;j++){
if((p[b][j]!=p[l][j])||p[l][0]==1111)//判断是否相同,是否用过,成立则跳出本论循环
break;
count++;
if (count==7){//count==7,表示这一行的数字都是相同的
sum++;z++;
for(j=0;j<7;j++)
a[j]=p[l][j];
p[l][0]=1111;//将用过的行的首项标记为1111,下次遇到,进行判断
}
}
l++;count=0;
}
if(sum>1){
for(j=0;j<7;j++){
cout<<a[j];
if(j==2)
cout<<"-";
} cout<<" "<<sum<<endl; //sum大于1,表示有相同的行,进行输出
}
sum=1;b++;x++;}
if(z==0)
cout<<"No duplicates.";//输出格式按照题目要求
return 0;
}
有满意答案会追加30分 展开
using namespace std;
#include<string>
int main(){
int n,i,j=0,k,x=0,b;
int a[7];
string str;
cin>>n;
int **p;
p=new int*[n];
for(i=0;i<n;i++){
p[i]=new int[7];
}
for(i=0;i<n;i++){
cin>>str;
for(k=0;k<str.size();k++)
{ if((str[k]=='-')||(str[k]=='Q')||(str[k]=='Z')) continue;//将输入的字符串储存到数组中,当遇到“-”号时跳过
else if((str[k]>='A')&(str[k]<='C'))
p[i][j]=2;
else if((str[k]>='D')&(str[k]<='F'))
p[i][j]=3;
else if((str[k]>='G')&(str[k]<='I'))
p[i][j]=4;
else if((str[k]>='J')&(str[k]<='L'))
p[i][j]=5;
else if((str[k]>='M')&(str[k]<='O'))
p[i][j]=6;
else if((str[k]>='P')&(str[k]<='S'))
p[i][j]=7;
else if((str[k]>='T')&(str[k]<='V'))
p[i][j]=8;
else if((str[k]>='W')&(str[k]<='Y'))
p[i][j]=9;
else if(str[k]=='1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0')
p[i][j]=(int)(str[k]-'0');
j++;}
j=0;
}
for(i=0;i<n-1;i++){
b=i+1;
for(j=0;j<n-x-1;j++){
if(p[i][0]>p[b][0]){
for(int s=0;s<7;s++){
a[s]=p[b][s];
p[b][s]=p[i][s];
p[i][s]=a[s]; //将转换成标准形式的数组按首位数字的大小从小到大排列
}
}
b++;
} x++;
}
x=0,b=0;
int count=0,l,sum=1,c,z=0;//以下是检索相同的号码
for(c=0;c<n-1;c++){
l=b+1;
for(k=0;k<n-x-1;k++){
for(j=0;j<7;j++){
if((p[b][j]!=p[l][j])||p[l][0]==1111)//判断是否相同,是否用过,成立则跳出本论循环
break;
count++;
if (count==7){//count==7,表示这一行的数字都是相同的
sum++;z++;
for(j=0;j<7;j++)
a[j]=p[l][j];
p[l][0]=1111;//将用过的行的首项标记为1111,下次遇到,进行判断
}
}
l++;count=0;
}
if(sum>1){
for(j=0;j<7;j++){
cout<<a[j];
if(j==2)
cout<<"-";
} cout<<" "<<sum<<endl; //sum大于1,表示有相同的行,进行输出
}
sum=1;b++;x++;}
if(z==0)
cout<<"No duplicates.";//输出格式按照题目要求
return 0;
}
有满意答案会追加30分 展开
2个回答
展开全部
#include<cstdlib>
#include<cstdio>
int comp(const void *a,const void *b)
{return *(int*)a-*(int*)b;}
int main()
{
char T[27]="2223334445556667-77888999-";
int N;
scanf("%d",&N);
getchar();
int *NO=new int[N+1];
int i=0;char c;
for(;i<N;i++)
{
NO[i]=0;
while((c=getchar())!='\n')
{
if(c>='A'&&c<='Z')c=T[c-'A'];
if('-'!=c)NO[i]=NO[i]*10+c-'0';
}
}
qsort(NO,i,sizeof(int),comp);
int n=0;
int k=1;
for(i=0;i<=N;i++)
{
if(NO[i]==NO[i+1])k++;
else if(k>=2)
{
int a=NO[i]/10000,b=NO[i]%10000;
printf("%03i-%04i %i\n",a,b,k);
k=1;n++;
}
}
if(0==n)printf("No duplicates.\n");
return 0;
}
希望能帮助你
#include<cstdio>
int comp(const void *a,const void *b)
{return *(int*)a-*(int*)b;}
int main()
{
char T[27]="2223334445556667-77888999-";
int N;
scanf("%d",&N);
getchar();
int *NO=new int[N+1];
int i=0;char c;
for(;i<N;i++)
{
NO[i]=0;
while((c=getchar())!='\n')
{
if(c>='A'&&c<='Z')c=T[c-'A'];
if('-'!=c)NO[i]=NO[i]*10+c-'0';
}
}
qsort(NO,i,sizeof(int),comp);
int n=0;
int k=1;
for(i=0;i<=N;i++)
{
if(NO[i]==NO[i+1])k++;
else if(k>=2)
{
int a=NO[i]/10000,b=NO[i]%10000;
printf("%03i-%04i %i\n",a,b,k);
k=1;n++;
}
}
if(0==n)printf("No duplicates.\n");
return 0;
}
希望能帮助你
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询