一些并不高深但对我固有思维不同的细节(更新中)


1.字符统计:一串字符统计其字符数量,不含空格换行。
注意EOF的使用(怕不是因为OJ,我现在可能都不知道EOF是什么鬼),以及getchar()的特性。

```

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5 int num; 
 6 char c;
 7 
 8 while (1) {
 9 c = getchar();
10 if (c == EOF) break;
11 if (c != ' ' && c != '\n')
12 num++;
13 }
14 printf("%d\n", num);
15 
16 return 0;
17 
18 }

```
2.字符串比较大小
这个函数接受两个字符串 s1,s2。这些字符串只能由小写字母组成,并且具有相同的长度。这个函数的输出是另一个长度与 s1,s2 相同的字符串 g。g 的第 i 个字符等于 s1 的第i 个字符和 s2 的第 i 个字符的最小值,简单来说,g[i]=min(s1[i],s2[i])。(详见洛谷)
注意在字符串的题目中,末尾记得加‘\0’否则……

```

 1 #include <stdio.h>
 2 int main()
 3 {
 4 char s1[103],s2[103],g[103];
 5 int len=0,i=0;
 6 scanf("%d",&len);
 7 
 8 scanf("%s",s1);
 9 scanf("%s",s2);
10 
11 for(i=0;i<len;i++)
12 {
13 if(s1[i]>s2[i])
14 {
15 g[i]=s2[i];
16 
17 }
18 if(s1[i]<s2[i])
19 {
20 break;
21 }
22 if(s1[i]==s2[i])
23 {
24 g[i]='z'; 
25 }
26 }
27 if(i==len)
28 {
29 g[i]='\0';
30 printf("%s",g);
31 }
32 else
33 printf("-1");
34 return 0;
35 }

```
3.阶梯计费及四舍五入

月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。
输入格式:

输入一个整数,表示用电总计(单位以千瓦时计),不超过10000。

输出格式:

输出一个数,保留到小数点后1位(单位以元计,保留到小数点后1位)

这道题做出大框架非常简单,但似乎四舍五入时出了一点问题,在没有做到这题以前,好像老师上课有教过怎么四舍五入,可惜没印象了,毕竟是老师单方面灌输的,事实上就是我只记得自己学的内容,考试也是凭着自己学的那点东西水过去的。

```

#include<stdio.h>
#define A 0.4463
#define B 0.4663
#define C 0.5663

int main()
{
double total=0,p1=0,p2=0,p3=0;
int used=0;

scanf("%d",&used);

if(used>=401)
{
p1=150;
p2=250;
p3=used-p1-p2;
}
else if(used>=151)
{
p1=150;
p2=used-p1;
}
else if(used>0)
{
p1=used;
}
total=p1*A+p2*B+p3*C;
total=int((total*10)+0.5)/10.0;

printf("%.1lf",total);
return 0;
}
```
不要问我怎么想起来要四舍五入的,因为我现在遇到OJ的题目基本上一遍过不了,试了几次就看题解,在题解里惊讶地发现,我去,还要四舍五入,我就直接%.1f了
下面划重点,如何四舍五入!!!(我是真的鶸鶸)

```
total=int((total*10)+0.5)/10.0;

```
4.超时问题
我还是第一次遇到TLE。
这一题也是上手很快,拿着草稿纸就写下了源码,结果敲到IDE里的时候,输入了样例,回车,光标静静地闪动,我又换了一个IDE,依然如此。我感觉是IDE有病,就直接提交到OJ,显示8个TLE,2个AC。。。

**这是时间复杂度贼高,算法水平无比落后的最初的想法orz。**

```
#include<stdio.h>
int main()
{
int M = 0, N = 0, box = 0, beg;
int num[10], bit = 0, temp = 0;
scanf("%d%d", &M, &N);
for (int i = 0; i < 10; i++)
{
num[i] = 0;
}
for (beg = M; beg <= N; beg++)
{
if (beg < 10)
{
num[beg]++;
}
else
{
box = beg;
while (beg > 0)
{
beg = beg / 10;
bit++;
}
for (int i = 0; i <= bit; i++)
{
temp = box % 10;
num[temp]++;
box = box / 10;
}
}
}
printf("%d %d %d %d %d %d %d %d %d %d\n", num[0], num[1], num[2], num[3], num[4], num[5], num[6], num[7], num[8], num[9]);
return 0;

```
关键是看起来好像自己还挺会使用for循环的样子结果输出却不知道要用循环,直接来一段暴力%d%d%d%d%d%d%d%d%d%d,醉了

下面是AC代码

```

int main()
{
int M=0,N=0,box=0,beg;
int num[10];
scanf("%d%d",&M,&N);
memset(num,0,sizeof(num));//参考洛谷题解orz学到了

for(beg=M;beg<=N;beg++)
{
box=beg;
while(box>0)
{
int x=box%10;
num[x]++;
box=box/10;

}    

} 
printf("%d %d %d %d %d %d %d %d %d %d\n",num[0],num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);
return 0;
}


```
再画个重点,数组一定要记得初始化,不然没有没有被赋值就是奇奇怪怪的数字了hhh
简单又装b的初始化数组技巧,感谢洛谷大佬..、

.` memset(num,0,sizeof(num));`

 5.

题目描述1-洛谷
经历千辛万苦,他收集了连续N(1<=N<=10^7)天的最高气温数据。

现在,他想知道最高气温一直上升的最长连续天数。

输入输出格式
输入格式:
*1行:一个整数N。1<=N<=10^7

*2行:N个空格隔开的整数,表示连续N天的最高气温。0<=最高气温<=10^9。

输出格式:
*1行:一个整数,表示最高气温一直上升的最长连续天数。
第一遍,1AC其他TLE
超高校级的时间复杂度加数组哭泣

#include <stdio.h>
int main()
{
    long long i, days, cnt=1,weather[10000000],box[10000000];
    for (i = 0; i < days; i++)
    {
        box[i] = 0; 
        scanf_s("%lld", &weather[i]);
    }

    for (i = 0; i < days-1; i++)
    {
        if (weather[i] < weather[i + 1])
            cnt++;
        else
        {
            box[i] = cnt;
            cnt = 1;
        }
    }
    cnt = box[0];
    for (i = 1; i < days; i++)
    {
        if (box[i] > cnt)
        {
            cnt = box[i];
        }
    }

    printf("%lld", cnt);
    return 0;
}

第二个AC代码

 1 #include <stdio.h>
 2 int main()
 3 {
 4     long long i, days, temp,first, cnt = 1,max=0;
 5     scanf_s("%lld", &days);
 6     scanf_s("%lld", &first);
 7     for (i = 2; i <=days; i++)
 8     {
 9         scanf_s("%lld",&temp);
10         if (temp>first)
11         {
12             cnt++;
13             if (cnt > max)//我感觉这里的if用了两次,可以省略的
14                 max = cnt;
15         }
16         else
17         {
18             if (cnt > max)//这样重复使用真的好丑233333
19                 max = cnt;
20             cnt = 1;
21         }
22         first = temp;
23     }
24     printf("%lld", max);
25     return 0;
26 }

猜你喜欢

转载自www.cnblogs.com/greenaway07/p/10478875.html