安丘网站建设制作,网络营销赚钱,接做网站单子,东莞市官网网站建设报价【题目描述】
给出一个由O和X组成的串#xff08;长度为1#xff5e;80#xff09;#xff0c;统计得分。每个O的得分为目前连续出现的O的个数#xff0c;X的得分为0。例如#xff0c;OOXXOXXOOO的得分为1200100123。
输入第一行表示有n个字符串#xff0c;后续是n行字…【题目描述】
给出一个由O和X组成的串长度为180统计得分。每个O的得分为目前连续出现的O的个数X的得分为0。例如OOXXOXXOOO的得分为1200100123。
输入第一行表示有n个字符串后续是n行字符串。
【样例输入】
5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX
【样例输出】
10
9
7
55
30
【题目来源】
刘汝佳《算法竞赛入门经典 第2版》习题3-1 得分Score, ACM/ICPC Seoul 2005, UVa1585 【解析】
本题是一道得分累加问题题目不难只需定义两个变量
①计数器cnt用于计算已经连续出现的“O”的个数
②累加器sum用于计算串的得分。
思路就是对输入串的字符进行遍历如果遇到“O”就cnt如果遇到“X”就将cnt重置为0然后每次将cnt加到sum中即可。
1用scanf输入字符串
#includestdio.h
char s[85];
int main(){int n;char c;scanf(%d, n);while(n--){int sum0, cnt0;scanf(%s, s);for(int i0; istrlen(s); i){if(Os[i]) cnt;else cnt0;sum cnt;}printf(%d\n, sum);}return 0;
}
代码说明
1代码精简。for循环中的代码可以进一步精简就是将cnt的自加与sum的累加合成一个语句改后代码如下
if(Os[i]) sum cnt;
else cnt0;
注意因为要返回自加后的值此时就需要用cnt不能用cnt关于二者的区别参见“找不到北的i”一文https://blog.csdn.net/jjmhx/article/details/136995419。
2效率问题。你是否发现代码中有一处写法效率低下。就是在“程序找茬统计字符个数问题”一文中提到的“重复调用函数”问题strlen函数放在for循环中会导致重复计算字符串的长度。解决方法就是预先将函数的值赋给一个变量在for循环中直接用这个变量。
3头文件缺失。在“程序找茬统计字符个数问题”一文中已提到不引用string.h头文件程序也能执行只是会有警告但是在Online Judge - Home网站中提交代码反馈错误。 如果因为这个问题丢分实属不值所以还是乖乖加上该加的头文件吧。
2用getchar输入字符
老金想着秀一下“编技”打一开始就想用getchar读取字符这样就用不着数组了没想到输出了意想不到的结果。
最开始编的代码是只是针对一个字符串的情况运行没有任何问题。代码如下
#includestdio.h
int main(){char c;int sum0, cnt0;while((cgetchar())!\n){if(Oc) cnt;else cnt0;sum cnt;}printf(%d\n, sum);return 0;
}
没想到改成多组字符串时出现了问题代码如下
#includestdio.h
int main(){int n;char c;scanf(%d, n);while(n--){int sum0, cnt0;while((cgetchar())!\n){if(Oc) cnt;else cnt0;sum cnt;}printf(%d\n, sum);}return 0;
}
运行结果 居然刚输入数字5就直接输出了结果什么情况
经过调试老金搞明白了原因问题出在了输入缓冲区。
执行到scanf(%d, n)这条语句时实际在键盘输入的是两个字符一个是’5’一是个换行符’\n’。 scanf函数只是读取了字符“5”并没有读入换行符。所以这条语句执行完后换行符还留在输入缓冲区。因此getchar第一次读取的是换行符循环条件不满足直接输出sum的初始值0。
搞清原因解决起来就好办了在while((cgetchar())!\n)前加一条语句把换行符读取掉就可以了。增加代码如下
getchar(); //清空缓冲区的换行符
所以在使用getchar()时要注意如果前面使用了scanf函数别忘了带走它留下的那片云彩。