先上题目(摘录)
A Quicksum is the sum of the products of each character’s position in the packet times the character’s value. A space has a value of zero, while letters have a value equal to their position in the alphabet. So, A=1, B=2, etc., through Z=26. Here are example Quicksum calculations for the packets “ACM” and “MID CENTRAL”
Example:
ACM: 11 + 23 + 313 = 46MID CENTRAL: 113 + 29 + 34 + 40 + 53 + 65 + 714 + 820 + 918 + 101 + 11*12 = 650
相当于写一个较为简单的纯文本校验器(“#”为输入结束标志)
上AC代码
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char str[255];
while(gets(str)&&str[0]!='#')
{
int len=strlen(str);
int sum=0;
for(int i=0;i<len;i++)
{
if(str[i]!=' ')
{
sum+=(str[i]-'A'+1)*(i+1);
}
}
cout<<sum<<endl;
}
return 0;
}
一些小心得(都是很简单的,不过俺是菜鸟,dalao请忽略)
- 循环的条件(这两个输入语法都可以)
gets(str)
或
cin.getline(str, sizeof(str))
至于为啥要把这个拎出来讲,主要是因为我还没学到字符串数组及相关的语法发个小牢骚
我一直感觉好多学校编程语言的教学方法是有点问题的,不应当按教科书划定的模板去教,而应当将日后编程题目最常用到的一些函数语法直接结合题目讲了(当然这只是对我这样的想超前学竞赛的菜有困难)例如本题中这两种输入有啥区别?哪种在什么情况下更有优势更稳定?包括之前还看到一些 题目直接写一个 getchar();为一行直接就蒙了,翻了好久资料才大概懂啥意思。
和我一样有疑问的可以看这个,写的比较清晰吧三种输入的区别
不过确实如果没有人手把手教你的话,最好的了解这些的方法还是不断刷题撞墙吧。。。
- 我目前的理解是用gets(str)一直向数组输入的话一定是从第0项开始的(不知道有没有改变从后面的项开始输入的方法),所以本题for循环中的i只能从0开始,且下面的乘积项变为 i+1 ,而不能i从1开始 。
- 我一开始想的是能不能用类似标记的方法 让A=1,B=2,…或类似switch语句那样的选择结构,这样用户输入时只要简单地调用标记再乘对应字母在数组中的位置就行(当然这可能就是初学者的理想思维)事实证明用ASCII码转换下才是最轻松的。(暂时还不知道将来会不会有题目会用到我上面那种思想)
这确实只是道很简单的的题目(求不喷,当然估计没人看得到),就当为我第一篇博客试个水吧。。