ZJGSU-ACM OJ 心得

一个我觉得蛮重要的问题,也是会经常碰到的问题

就是觉得自己对的代码提交到OJ发现输出超限

我是真的输出超限了吗?

QAQ

其实,不然。

 

我把这类问题分为几类:

(一):死循环:while(1)

 

   比如以下这行代码:

 

1 while(1)
2 {
3 
4 }

 

看似此while(1)很不起眼,那我就再举一个例子吧

 

2264: 矩阵转换(指针题)

时间限制: 1 Sec  内存限制: 32 MB
提交: 665  解决: 168
[提交][状态][讨论版]

题目描述

将一个5X5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下一次从小到大存放),写个一函数来实现,用main函数调用。(要求用指针来做)

输入

每组数据为5X5的矩阵,矩阵的数字为整数。有多组测试数据,直到输入文件结束。

输出

输出按题目要求改变后的矩阵,每组结果后空一行。

 

样例输入

35 34 33 32 31
30 29 28 27 26
25 24 23 22 21
20 19 18 17 16
15 14 13 12 11

样例输出

11 34 33 32 12
30 29 28 27 26
25 24 35 22 21
20 19 18 17 16
13 23 15 31 14

 

我的原代码是:

 1 #include<stdio.h>
 2 #include<string.h>
 3 int main()
 4 {
 5     void fun(int a[][6]);
 6     int i,j;
 7     int a[6][6];
 8     while(1)
 9     {
10         for(i=0;i<5;i++)
11             for(j=0;j<5;j++)
12                 scanf("%d",&a[i][j]);
13         fun(a);
14         for(i=0;i<5;i++)
15         {
16             for(j=0;j<5;j++)
17                 printf("%d ",a[i][j]);
18             printf("\n");
19         }
20     }
21     return 0;
22 }
 1 void fun(int a[][6])
 2 {
 3     int i,j,max,min1,min2,min3,min4;
 4     int tmp;
 5     int ti,tj;
 6     max=a[0][0];
 7     for(i=0;i<5;i++)
 8     {
 9         for(j=0;j<5;j++)
10         {
11             if(a[i][j]>=max)
12             {
13                 max=a[i][j];
14                 ti=i;tj=j;
15             }
16         }
17     }
18     tmp=a[2][2];a[2][2]=a[ti][tj];a[ti][tj]=tmp;
19  
20     min1=a[2][2];
21     for(i=0;i<5;i++)
22     {
23         for(j=0;j<5;j++)
24         {
25             if(a[i][j]<=min1)
26             {
27                 min1=a[i][j];
28                 ti=i;tj=j;
29             }
30         }
31     }
32     tmp=a[0][0];a[0][0]=a[ti][tj];a[ti][tj]=tmp;
33  
34     min2=a[2][2];
35     for(i=0;i<5;i++)
36     {
37         for(j=0;j<5;j++)
38         {
39             if(i!=0||j!=0)
40             {
41                 if(a[i][j]<=min2)
42                 {
43                     min2=a[i][j];
44                     ti=i;tj=j;
45                 }
46             }
47         }
48     }
49     tmp=a[0][4];a[0][4]=a[ti][tj];a[ti][tj]=tmp;
50  
51     min3=a[2][2];
52     for(i=0;i<5;i++)
53     {
54         for(j=0;j<5;j++)
55         {
56             if((i!=0||j!=0)&&(i!=0||j!=4))
57             {
58                 if(a[i][j]<=min3)
59                 {
60                     min3=a[i][j];
61                     ti=i;tj=j;
62                 }
63             }
64         }
65     }
66     tmp=a[4][0];a[4][0]=a[ti][tj];a[ti][tj]=tmp;
67  
68     min4=a[2][2];
69     for(i=0;i<5;i++)
70     {
71         for(j=0;j<5;j++)
72         {
73             if((i!=0||j!=0)&&(i!=0||j!=4)&&(i!=4||j!=0))
74             {
75                 if(a[i][j]<=min4)
76                 {
77                     min4=a[i][j];
78                     ti=i;tj=j;
79                 }
80             }
81         }
82     }
83     tmp=a[4][4];a[4][4]=a[ti][tj];a[ti][tj]=tmp;
84     return;
85 }
View Code

(查看完全代码点击View Code)

 

解决方案:

 1 #include<stdio.h>
 2 #include<string.h>    
 3 int a[6][6];
 4 void fun()
 5 {
 6     int i,j,max,min1,min2,min3,min4;
 7     int tmp;
 8     int ti,tj;
 9     max=a[0][0];
10     for(i=0;i<5;i++)
11     {
12         for(j=0;j<5;j++)
13         {
14             if(a[i][j]>=max)
15             {
16                 max=a[i][j];
17                 ti=i;tj=j;
18             }
19         }
20     }
21     tmp=a[2][2];a[2][2]=a[ti][tj];a[ti][tj]=tmp;
22 
23     min1=a[2][2];
24     for(i=0;i<5;i++)
25     {
26         for(j=0;j<5;j++)
27         {
28             if(a[i][j]<=min1)
29             {
30                 min1=a[i][j];
31                 ti=i;tj=j;
32             }
33         }
34     }
35     tmp=a[0][0];a[0][0]=a[ti][tj];a[ti][tj]=tmp;
36 
37     min2=a[2][2];
38     for(i=0;i<5;i++)
39     {
40         for(j=0;j<5;j++)
41         {
42             if(i!=0||j!=0)
43             {
44                 if(a[i][j]<=min2)
45                 {
46                     min2=a[i][j];
47                     ti=i;tj=j;
48                 }
49             }
50         }
51     }
52     tmp=a[0][4];a[0][4]=a[ti][tj];a[ti][tj]=tmp;
53 
54     min3=a[2][2];
55     for(i=0;i<5;i++)
56     {
57         for(j=0;j<5;j++)
58         {
59             if((i!=0||j!=0)&&(i!=0||j!=4))
60             {
61                 if(a[i][j]<=min3)
62                 {
63                     min3=a[i][j];
64                     ti=i;tj=j;
65                 }
66             }
67         }
68     }
69     tmp=a[4][0];a[4][0]=a[ti][tj];a[ti][tj]=tmp;
70 
71     min4=a[2][2];
72     for(i=0;i<5;i++)
73     {
74         for(j=0;j<5;j++)
75         {
76             if((i!=0||j!=0)&&(i!=0||j!=4)&&(i!=4||j!=0))
77             {
78                 if(a[i][j]<=min4)
79                 {
80                     min4=a[i][j];
81                     ti=i;tj=j;
82                 }
83             }
84         }
85     }
86     tmp=a[4][4];a[4][4]=a[ti][tj];a[ti][tj]=tmp;
87     return;
88 }
View Code
 1 int main()
 2 {
 3     int i,j;
 4 
 5     while(scanf("%d",&a[0][0])!=EOF)
 6     {
 7         for(i = 1;i < 5;i++)
 8         {
 9             scanf("%d",&a[0][i]);
10         }
11         for(i=1;i<5;i++)
12             for(j=0;j<5;j++)
13                 scanf("%d",&a[i][j]);
14         fun();
15         for(i=0;i<5;i++)
16         {
17             for(j=0;j<5;j++)
18                 printf("%d ",a[i][j]);
19             printf("\n");
20         }
21         printf("\n");
22     }
23     return 0;
24 }

(查看完全代码点击View Code)

 

(二)不当输入 while(gets(string)!=EOF)

  比如以下这段代码:

1 while(gets(string)!=EOF)
2 {
3 
4 }

 

举个刚刚AC了的例子~

问题 B: 能被四整除吗???

时间限制: 1 Sec  内存限制: 32 MB
提交: 30  解决: 17
[提交][状态][讨论版]

题目描述

这题有点水,主要的目的是想让你们知道数字的一些奇妙之处。题意很简单,给你一个数,让你判断是否能被4整除。

 

输入

输入有多组,直到EOF
每组一行,包括一组数,数字很大,长度不超过2000,int是存不了的,同时也是支持字母输入的(A~I 或 a ~ i)。A和a表示1,B和b表示2。。。。I和i表示9.是不是感觉到了来自学长的恶意了呢?

 

输出

输出Yes或者No。我比较喜欢逆向思维,所以呢,能被四整除输出No,不能则输出Yes。

 

 

样例输入

201314 ababababababababababababab

样例输出

Yes No
 
我的原代码是:
1 #include <stdio.h>
2 #include <string.h>
3 int main()
4 {
5     int ll,i;
6     int uiu;
7     char sun[2000];
8     while(gets(sun)!=EOF)
 1  {
 2         ll=strlen(sun);
 3         for(i=0;i<ll;i++)
 4     {
 5         if(sun[i]>='a'&&sun[i]<='z')
 6             sun[i]=sun[i]-'a'+'1';
 7         else if(sun[i]>='A'&&sun[i]<='Z')
 8             sun[i]=sun[i]-'A'+'1';
 9     }
10     if(ll==1)
11     {
12     if((sun[0]-'0')%4==0)
13     {
14         printf("No\n");
15     }
16     else
17         printf("Yes\n");
18     }
19     else
20         {
21         uiu=(sun[ll-1]-'0')+(sun[ll-2]-'0')*10;
22         if(uiu%4==0)
23         printf("No\n");
24         else
25         printf("Yes\n");
26         }
27     }
28     return 0;
29 }
View Code

(查看完全代码点击View Code)

 

解决方案:

1 #include <stdio.h>
2 #include <string.h>
3 int main()
4 {
5     int ll,i,uiu;
6     char sun[2000];
7     while(scanf("%s",sun)!=EOF)
 1 {
 2         ll=strlen(sun);
 3         for(i=0;i<ll;i++)
 4         {
 5             if(sun[i]>='a'&&sun[i]<='z')//将字母转化成数字
 6                 sun[i]=sun[i]-'a'+'1';
 7             else if(sun[i]>='A'&&sun[i]<='Z')
 8                 sun[i]=sun[i]-'A'+'1';
 9         }
10         if(ll==1)//如果数组长度只有一位的时候
11         {
12             if((sun[0]-'0')%4==0)
13             {
14                 printf("No\n");
15             }
16             else
17                 printf("Yes\n");
18         }
19         else//数组长度超过两位,则取最后两位判断是否能被4整除
20             {
21                 uiu=(sun[ll-1]-'0')+(sun[ll-2]-'0')*10;
22                 if(uiu%4==0)
23                 printf("No\n");
24                 else
25                 printf("Yes\n");
26             }
27     }
28     return 0;
29 }
View Code

(查看完全代码点击View Code)

 

posted @ 2013-12-08 00:53  Jeremy Wu  阅读(580)  评论(0编辑  收藏  举报