注册 登录
编程论坛 C++教室

Quicksum问题求助

发布于 2010-08-01 09:27, 418 次点击
   题目的意思大概是这样:校验和是通过一定的算法扫描一个数据计算出的一个数值。如果数据被改变了,则校验和也应该发生变化,这样就可以判断数据在传输过程中是否出现差错。在这个问题中,你将实现一个称为Quicksum的校验和算法。Quicksum算法计算由大写字母和空格组成的数据。并且数据开始和结尾的空格不加入计算。一个数据的Quicksum是每个字符的在数据中的位置乘以该字符的值。空格值为0,字母的值就是其在字母表中的位置。因此A=1,B=2,etc。如下是 "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

输入:


每个输入只包含一个数据,占一行,不会以空格开头结尾,长度不超过255字符。

输出:


对于每一个数据,输出其校验和,占一行。   

输入样例:


REGIONAL   PROGRAMMING   CONTEST
输出样例:


4690
                    编写程序如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
    char a[256];
    int sum,i,n;
    while(gets(a)!=NULL)
    {
            if(strcmp(a,“#”)==0)
            break;
            sum=0;
            n=strlen(a);
            for(i=0;i<n;i++)
            {
                            if(a[i]!=‘ ')
                            {sum+=(a[i]-‘A'+1)*(i+1);}
                            }
                        
                            printf("%d\n",sum);
                            }
                            return 0;
                            }

疑问:开始的时候,我的while语句是这样写的  while(1)然后结果是130且无限循环,为什么?
if(strcmp(a,“#”)==0)如果写成if(strcmp(a,‘#’)==0)  在DevC++中则会显示这行编译有错误  请问  #是字符还是字符串啊?
for语句的i为什么从0开始,从1开始错在哪里?
{sum+=(a[i]-‘A'+1)*(i+1);}是怎么计算和的?  第一次计算时i是多少呀?
如果printf("%d\n",sum);写成 cout<<endl;
                            cout<<sum;   为什么不自动换行了,例如输入ACM 回车得到46,不自动换行了。
问题有点多,请耐心解答,您的讲解是我进步的原因,谢谢。





1 回复
#2
mxs8102010-08-01 11:07
if(strcmp(a,“#”)==0)如果写成if(strcmp(a,‘#’)==0)  在DevC++中则会显示这行编译有错误  请问  #是字符还是字符串啊?
“#”表示字符串,‘#’表示字符
“while(1)然后结果是130且无限循环”
   以下这条语句要是老不能成立,自然就死循环了
    if(strcmp(a,“#”)==0)
    break;
“for语句的i为什么从0开始,从1开始错在哪里?”
数组是从0开始计数的a[0]表示数组的第1项,依此类推

先回答这些~~~~
体会一下,看看后面的问题是不是能自己理解了



[ 本帖最后由 mxs810 于 2010-8-1 11:10 编辑 ]
1