说来惭愧,题目挺简单的,但是最后调试阶段出了不少问题,结果最后未来得及提交程序,记之。
先上题目吧,大概就是输入字符串(纯字母),按照每个字母权值计算字符串的整个权值),现在还没想好这题抽象出来是哪一类问题,各位大神想到了麻烦告知一下小弟。
然后说一下我主要出的问题:申请一个int型数组,n(输入)个元素。①想用int num[n]来申请:后来一想,n是运行时输入,而num的分配是在编译连接之前。②使用 new的时候忘记对num进行初始化了,后来初始化使用memset(num,0,n)初始化,memset的第三个参数错了,n*sizeof(int),因为memset是按照char大小初始化的。
再说说思路吧,就是用num[n]存储每个字符串的权值,再处理每个字符串的时候,顺序读取并处理每个字符,用value存储前一个重复的字符,而cur_va存贮当前读取字符,k为value重复的个数。当前字符cur_va跟重复字符value相同(部分大小写),处理k;当当前字符cur_va跟重复字符value不同,结算num[i],并将value置为当前读入字符(小写)并设置k;每一次内部循环(一个字符串)结束前,判断是否是最后一个字符,如果是就处理num[i];
最后输出num[n]
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n;
cin>>n;
int *num;
num =new int[n];
memset(num,0,n*sizeof(int));
for(int i=0; i<n; i++)
{
string inp;
int k=0;
int value=0;
cin>>inp;
const char *p = inp.c_str();
int len = inp.length();
//cout<<"len="<<len<<endl;
for(int j=0;j<len;j++)
{
int cur_va =0;
//开始
if(value == 0)
{
cur_va = int(*p);
p++;
//大写
if(cur_va<97)
{
value = cur_va+32;
k+=2;
}
else{
value = cur_va;
k++;
}
//cout<<"cur_va="<<cur_va<<"\t"<<"k="<<k<<"value="<<value<<endl;
continue;
}
cur_va = (int)*p;
p++;
//cout<<"cur_va="<<cur_va<<"\t";
//cout<<"value="<<value<<"\t";
//判断现在跟以前的字母相同与否
if(value == cur_va)
k++;
else if(value == (cur_va+32)){
k+=2;
}
else{
num[i]+=(k*k*(value-96));
if(cur_va<97){
value=cur_va+32;
k = 2;
}
else{
value = cur_va;
k = 1;
}
}
//zuihouyiquan
if(j == len-1)
{
num[i]+=(k*k*(value-96));
k=0;
value=0;
}
//cout<<"k="<<k<<"\t"<<"value="<<value<<endl;
}
}
cout<<endl;
for(int m=0;m<n;m++)
cout<<num[m]<<endl;
return 0;
}