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


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

#include <stdio.h>

int main()
{
int num; 
char c;

while (1) {
c = getchar();
if (c == EOF) break;
if (c != ' ' && c != '\n')
num++;
}
printf("%d\n", num);

return 0;

}
View Code

 

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 }
View Code

 

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

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

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

输出格式:

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

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

```

 1 #include<stdio.h>
 2 #define A 0.4463
 3 #define B 0.4663
 4 #define C 0.5663
 5 
 6 int main()
 7 {
 8 double total=0,p1=0,p2=0,p3=0;
 9 int used=0;
10 
11 scanf("%d",&used);
12 
13 if(used>=401)
14 {
15 p1=150;
16 p2=250;
17 p3=used-p1-p2;
18 }
19 else if(used>=151)
20 {
21 p1=150;
22 p2=used-p1;
23 }
24 else if(used>0)
25 {
26 p1=used;
27 }
28 total=p1*A+p2*B+p3*C;
29 total=int((total*10)+0.5)/10.0;
30 
31 printf("%.1lf",total);
32 return 0;
33 }
34 ```
35 不要问我怎么想起来要四舍五入的,因为我现在遇到OJ的题目基本上一遍过不了,试了几次就看题解,在题解里惊讶地发现,我去,还要四舍五入,我就直接%.1f了
36 下面划重点,如何四舍五入!!!(我是真的鶸鶸)
37 
38 ```
39 total=int((total*10)+0.5)/10.0;
View Code

 

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

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

 

 1 ```
 2 #include<stdio.h>
 3 int main()
 4 {
 5 int M = 0, N = 0, box = 0, beg;
 6 int num[10], bit = 0, temp = 0;
 7 scanf("%d%d", &M, &N);
 8 for (int i = 0; i < 10; i++)
 9 {
10 num[i] = 0;
11 }
12 for (beg = M; beg <= N; beg++)
13 {
14 if (beg < 10)
15 {
16 num[beg]++;
17 }
18 else
19 {
20 box = beg;
21 while (beg > 0)
22 {
23 beg = beg / 10;
24 bit++;
25 }
26 for (int i = 0; i <= bit; i++)
27 {
28 temp = box % 10;
29 num[temp]++;
30 box = box / 10;
31 }
32 }
33 }
34 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]);
35 return 0;
View Code

 

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

下面是AC代码

``

 1 int main()
 2 {
 3 int M=0,N=0,box=0,beg;
 4 int num[10];
 5 scanf("%d%d",&M,&N);
 6 memset(num,0,sizeof(num));//参考洛谷题解orz学到了
 7 
 8 for(beg=M;beg<=N;beg++)
 9 {
10 box=beg;
11 while(box>0)
12 {
13 int x=box%10;
14 num[x]++;
15 box=box/10;
16 
17 }    
18 
19 } 
20 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]);
21 return 0;
22 }
View Code

 


```
再画个重点,数组一定要记得初始化,不然没有没有被赋值就是奇奇怪怪的数字了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
超高校级的时间复杂度加数组哭泣

 1 #include <stdio.h>
 2 int main()
 3 {
 4     long long i, days, cnt=1,weather[10000000],box[10000000];
 5     for (i = 0; i < days; i++)
 6     {
 7         box[i] = 0; 
 8         scanf_s("%lld", &weather[i]);
 9     }
10 
11     for (i = 0; i < days-1; i++)
12     {
13         if (weather[i] < weather[i + 1])
14             cnt++;
15         else
16         {
17             box[i] = cnt;
18             cnt = 1;
19         }
20     }
21     cnt = box[0];
22     for (i = 1; i < days; i++)
23     {
24         if (box[i] > cnt)
25         {
26             cnt = box[i];
27         }
28     }
29 
30     printf("%lld", cnt);
31     return 0;
32 }
View Code

 

第二个AC代码

 

L1-003 个位数统计 (15 point(s))

给定一个 k 位整数 1 (0, ,, dk1​​>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定 0,则有 2 个 0,3 个 1,和 1 个 3。

 

这题一开始。。。我想都没想,直接来了一个

很显然...自己用几个数测试一下就是溢出了23333

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iomanip>
#include<string>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <memory.h>
#include <stdlib.h> 

using namespace std;
int main()
{
    unsigned long long x;
    while(scanf("%llu",&x)!=EOF)
    {

        int cnt[11];
        bool vis[11];
        memset(cnt,0,sizeof(cnt));
        memset(vis,false,sizeof(vis));
        int t;
        
        while(x>0)
        {
            cnt[x%10]++;
            vis[x%10]=true;
            x=x/10;
        }
        
        for(int i=0;i<=9;i++)
        {
            if(vis[i])
            printf("%d:%d\n",i,cnt[i]);
        }
    }
}
View Code

 

所以改成读取字符串,读一个,加一个。

 

关于大素数小区间的新方法:不用打表,不用埃氏筛。

http://www.gonglin91.com/2018/10/14/big-prime/

、、、

posted @ 2019-03-05 19:04  鹤花之歌  阅读(217)  评论(0编辑  收藏  举报