注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

告别迷茫

梦想与现实的差距,就是我们生活的意义。因为我们有差距,我们才会一直积累,在努力。

 
 
 

日志

 
 

Quicksum  

2014-03-17 22:47:55|  分类: STL ACM |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
A checksum is an algorithm that scans a packet of data and returns a single number. The
idea is that if the packet is changed, the checksum will also change, so checksums are often used
for detecting transmission errors, validating document contents, and in many other situations
where it is necessary to detect undesirable changes in data.
For this problem, you will implement a checksum algorithm called Quicksum. A Quicksum
packet allows only uppercase letters and spaces. It always begins and ends with an uppercase
letter. Otherwise, spaces and letters can occur in any combination, including consecutive spaces.
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”:
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
Input
The input consists of one or more packets followed by a line containing only # that signals
the end of the input. Each packet is on a line by itself, does not begin or end with a space, and
contains from 1 to 255 characters.
Output
For each packet, output its Quicksum on a separate line in the output.
Example Input
Example Output
ACM
MID CENTRAL
REGIONAL PROGRAMMING CONTEST
CAN
46
650
4690
49
A C M
ABC
BBC
#
75
14
15
checksum 是扫描一个数据包并返回一个数值的一种算法。其思路在于,如果数据包被
修改过,那么,checksum 也会立即变化。所以,checksum 常常用于侦查数据传输错误,证
实文档内容的完整性和其他需要检查数据不被修改的场合。
在本题中,你将实现一个 checksum 算法即 Quicksum。一个 Quicksum 数据包仅允许包
1
含大写字母和空格,它通常是由一个大写字母开始和结束。然而,空格和字母可以出现在
其他的位置中,连续的空格也是允许的。
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
2.输入描述
输入数据包含一个或多个数据包,输入数据以“#”结束。每个数据包占一行,不能以
空格开始或结束,包含 1~255 个字符

本题要求计算一个数据包(即一行字符串)的 Quicksum。所谓 Quicksum,就是指一
行字符串(数据包)中每个字符的位置与该字符的值的乘积相加的结果。一个数据包占一
行,仅由大写字母和空格组成;位置由 1 开始计数,空格也占一个位置;A~Z 的值对应
为 1~26,空格的值为 0。
本题的难点就是数据的读入。可采用 cin.getline()一行一行读入数据;也可以采用
cin.get()一个一个读入字符,但需要注意的是,cin.get()不会忽略任何字符,对于回车符需
要单独处理。

(1)下面是 cin.get()版本,字符一个一个读入。
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
ifstream cin("aaa.txt");
char ch;
int i=1;
int sum=0;
//cin 会忽略回车、空格、Tab 跳格
//采用 cin.get()一个一个读,就不会忽略任何字符
//也可以采用 cin.getline()一行一行读入
while(cin.get(ch))
{
if(ch=='#')break;//读完全部输入
if(ch!='\n')//没读完一行

//空格字符不用计算
if(ch!=' ')sum=sum+i*(ch-64);
i++;
}
if(ch=='\n')
{
cout<<sum<<endl;
sum=0;
i=1;
}
}
return 0;
}
(2)下面是 cin.getline()版本,一次读入一行。
#include <fstream>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
ifstream cin("aaa.txt");
char ch[256];
int i=1;
int sum=0;
//cin 会忽略回车、空格、Tab 跳格
//采用 cin.get()一个一个读,就不会忽略任何字符
//也可以采用 cin.getline()一行一行读入
while(cin.getline(ch,256))//这就是那个换行的字符的大小啊
{
if(ch[0]=='#')break;
for(int i=0;ch[i]!='\0';i++)
if(ch[i]!=' ')sum=sum+(i+1)*(ch[i]-64);
cout<<sum<<endl;
sum=0;
}
return 0;


  评论这张
 
阅读(4)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017