一些并不高深但对我固有思维不同的细节(更新中)
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; }
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位)
这道题做出大框架非常简单,但似乎四舍五入时出了一点问题,在没有做到这题以前,好像老师上课有教过怎么四舍五入,可惜没印象了,毕竟是老师单方面灌输的,事实上就是我只记得自己学的内容,考试也是凭着自己学的那点东西水过去的。
```
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;
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;
```
关键是看起来好像自己还挺会使用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 }
```
再画个重点,数组一定要记得初始化,不然没有没有被赋值就是奇奇怪怪的数字了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 }
第二个AC代码
L1-003 个位数统计 (15 point(s))给定一个 k 位整数 1 (0, ,, dk−1>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]); } } }
所以改成读取字符串,读一个,加一个。
关于大素数小区间的新方法:不用打表,不用埃氏筛。
http://www.gonglin91.com/2018/10/14/big-prime/
、、、