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)

 

转载于:https://www.cnblogs.com/wushuaiyi/p/3463493.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值