user-0 提问: acm1015 请各位喜欢编程大牛帮我看下

回复:
user: user-1
content: 大神的方法需要把数组开大一点。  char a[100000000]; char o[100000000];

user: user-0
content: 引用 7 楼 ALNG 的回复:前面说反了，是慢出。  现在说另一个问题。如果该题对内存方面限制较宽，通过把输出串在内存中处理好再用printf一次输出，对性能会有什么样的影响呢？ 可以先估计一下。  下面是按这个思路修改后的程序:  #include <stdio.h> #include <string.h>  char a[200*200+1]; char o[200*200+1];  int main() { 	int r,c,i,j,k,ch; 	scanf("%d%d",&r,&c); 	getchar(); 	while(gets(a)) 	{ 		i=j=0; 		while((ch=a[i++])!=0) 		{ 			if(ch>='a' && ch<='z') 				ch+='A'-'a'; 			if(ch>='A' && ch<='Z') 				a[j++]=ch; 		} 		for(i=0;i<r*c;++i) 		{ 			k=i%r*c+i/r; 			o[i]=k<j?a[k]:'A'+(k-j)%26; 		} 		o[j]='\0'; 		printf("%s\n",o); 	} 	return 0; }   测试结果，平均耗时仅60ms, 对这题来说，这是一种显著的提升。  大神 我把你的程序传上去 也是wrong anwser ··怎么办

user: user-0
content: 引用 4 楼 derekrose 的回复:边界性测试试过没有 这个边界有哪些啊 我基本都测了 想不出来测什么了

user: user-0
content: 进过上述修改  还是有错··wrong anwser  我贴一段别人接受的代码 大家帮我看看有什么区别 我看了好久 虽然思路不同 但是结果感觉都一样#include<stdio.h> #include<string.h> #include<ctype.h> int main() {  char a[220][220],b[41000],c[41000];  int x,y,i,j,k,len,m;  scanf("%d%d",&x,&y);  getchar();  while(gets(b))   {     k=0;     len=strlen(b);     for(i=0;i<len;i++)       {       if(b[i]>='a'&&b[i]<='z')       {c[k]=toupper(b[i]);k++;}       if(b[i]>='A'&&b[i]<='Z')       {c[k]=b[i];k++;}       }     k=0;len=strlen(c);m=0;     for(i=0;i<x;i++)       for(j=0;j<y;j++)         {         {a[i][j]=c[k];k++;}         if(len<=x*y&&a[i][j]==0)         {a[i][j]='A'+m;m++;         if(a[i][j]>='Z') m=0;}         }     for(j=0;j<y;j++)         for(i=0;i<x;i++)          printf("%c",a[i][j]);     memset(a,0,sizeof(a));     memset(c,0,sizeof(c));          printf("\n");      }     return 0; }        引用 2 楼 KenZhang1031 的回复:str2不够大，如果输入x=200,y=200，那么str2至少要200*200+1`才足够。

user: user-2
content: 三个回复不能再回复，CSDN太土。我一早就发现问题了，但发不了言，是下面这行的问题:  [code=c]     while(gets(a))     {         i=j=0;         while((ch=a[i++])!=0)         {             if(ch>='a' && ch<='z')                 ch+='A'-'a';             if(ch>='A' && ch<='Z')                 a[j++]=ch;         }         for(i=0;i<r*c;++i)         {             k=i%r*c+i/r;             o[i]=k<j?a[k]:'A'+(k-j)%26;         }         // 原来的程序错在这里         o[i]='\0';// j应该改成i, j是输入串长度的别名，i在这里是r*c, 即矩阵元素个数。         printf("%s\n",o);     }     return 0; [code]  我试了，一次通过。

user: user-2
content: 前面说反了，是慢出。  现在说另一个问题。如果该题对内存方面限制较宽，通过把输出串在内存中处理好再用printf一次输出，对性能会有什么样的影响呢？ 可以先估计一下。  下面是按这个思路修改后的程序:  #include <stdio.h> #include <string.h>  char a[200*200+1]; char o[200*200+1];  int main() { 	int r,c,i,j,k,ch; 	scanf("%d%d",&r,&c); 	getchar(); 	while(gets(a)) 	{ 		i=j=0; 		while((ch=a[i++])!=0) 		{ 			if(ch>='a' && ch<='z') 				ch+='A'-'a'; 			if(ch>='A' && ch<='Z') 				a[j++]=ch; 		} 		for(i=0;i<r*c;++i) 		{ 			k=i%r*c+i/r; 			o[i]=k<j?a[k]:'A'+(k-j)%26; 		} 		o[j]='\0'; 		printf("%s\n",o); 	} 	return 0; }   测试结果，平均耗时仅60ms, 对这题来说，这是一种显著的提升。

user: user-2
content: 楼主方法的重新实现  #include <stdio.h> #include <string.h>  char a[200*200+1];   int main() { 	int r,c,i,j,k,ch; 	scanf("%d%d",&r,&c); 	getchar(); 	while(gets(a)) 	{ 		i=j=0; 		while((ch=a[i++])!=0) 		{ 			if(ch>='a' && ch<='z') 				ch+='A'-'a'; 			if(ch>='A' && ch<='Z') 				a[j++]=ch; 		} 		a[j]='\0'; 		for(i=0;i<r*c;++i) 		{ 			k=i%r*c+i/r; 			//printf("%c",k<j?a[k]:'A'+(k-j)%26); 			putchar(k<j?a[k]:'A'+(k-j)%26); 		} 		putchar('\n'); 	} 	return 0; }   上面内循环中用printf("%c"...）比用putchar，根据我的测试(输出重定向到普通文件，行列都是200，大概10行左右的数据),要快出10% (6次平均99ms vs 110ms)

user: user-2
content: kenzhang说到了要害。   说另一个层面的问题，这题虽然谈不上什么算法，但楼主的实现可能运行效率还是会稍差。有些地方从C程序员的角度可以说不聪明。  比如对输入串进行整理(小写转大写，滤去非字母字符)后，那个k是什么呢？正是str2的strlen，所以后面的strlen调用多余，显得不聪明。  第二个问题，第二个串是否有必要存在？ 从楼主的实现来看完全没有存在的必要，整理串直接写在str中就可以了。楼主的程序完全无必要的增加了程序的memeory footprint.  第三个问题，反复printf("%c",aChar)比之putchar(aChar)会有较大的性能损失。因为printf要翻译格式串的，如果调用次数够多，会有可觉察的速度差异。

user: user-3
content: 明文里非英文字符有多少不知道，一次性gets的话200*200+1还是不够大，用getchar按字读取过滤后再放入数组里...

user: user-4
content: 边界性测试试过没有

user: user-5
content: 而且下标是从0到x*y-1，所以要用for(i=strlen(str2);i<sum;i++,zimu++)而不是i<=sum 引用 2 楼 KenZhang1031 的回复:str2不够大，如果输入x=200,y=200，那么str2至少要200*200+1`才足够。

user: user-5
content: str2不够大，如果输入x=200,y=200，那么str2至少要200*200+1`才足够。

user: user-0
content: 系统总是提醒我 wrong anwser  我都不好意思传了  我试了很多种答案 都是正确的， 真心不知道错哪了！ 求指教