锁定老帖子 主题:Quicksum
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-22
记录一下,最近在整ACM的东西
题目 Quicksum checksum 是扫描一个数据包并返回一个数值的一种算法。其思路在于,如果数据包被 修改过,那么,checksum 也会立即变化。所以,checksum 常常用于侦查数据传输错误,证 实文档内容的完整性和其他需要检查数据不被修改的场合。 在本题中,你将实现一个 checksum 算法即 Quicksum。一 个 Quicksum 数据包仅允许包含大写字母和空格,它通常是由一个大写字母开始和结束。然而,空格和字母可以出现在其他的位置中,连续的空格也是允许的。 Quicksum 是一行字符串(数据包)中每个字符的位置与该字符的值的乘积之和。空格 的值是 0,字母的值等于它在字母表中的位置。所以,A 的值是 1,B 的值是 2,依此类推,Z 的值是 26。下面两个例子是求“ACM”和“MID CENTRAL”的 Quicksum: ACM: 1*1 + 2*3 + 3*13 = 46 MID CENTRAL: 1*13 + 2*9 + 3*4 + 4*0 + 5*3 + 6*5 + 7*14 + 8*20 + 9*18 + 10*1 + 11*12 = 650
输入描述 输入数据包含一个或多个数据包,输入数据以“#”结束。每个数据包占一行,不能以空格开始或结束,包含 1~255 个字符。
输出描述 对于每个数据包,在每一行上输出它的 Quicksum。 输入样例 输出样例 ACM MID CENTRAL REGIONAL PROGRAMMING CONTEST CAN A C M ABC BBC # 46 650 4690 49 75 14 15
#include<iostream> #include<string> using namespace std; int main() { char ch[256]; int sum; while(cin.getline(ch,256)) { if(ch[0] == '#') { break; } sum = 0; for(int i=0;ch[i] != '\0';i++) { if(ch[i] != ' ') { sum += (i+1)*(ch[i] - 64); } } cout<<sum<<endl; } } 以上,数据的读入,按照一行一行的方式读入数据,可以直接忽视掉'\n'
#include<iostream> #include<string> using namespace std; int main() { char ch; int sum; int i ; i = 1; sum = 0; while(cin.get(ch)) { if(ch == '#') { break; } if(ch != '\n') { if(ch != ' ') { sum += i*(ch - 64); } i++; } if(ch == '\n') { cout<<sum<<endl; sum = 0; i = 1; } } return 0; } 而,cin.get()函数,是一个一个的读入字符,cin.get()函数不会忽视掉'\n',因此,需要对回车符进行单独处理。
A~Z的值对应1~26,而A的ASCII为65,因此,A对应的值,就是ch-64。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 1855 次