这题的加密字符 - (Fibnacci % 26),如果得到的字符小于'a',就等于加密字符 - (Fibnacci % 26)+26。
获得题目的函数如下:
void getItem(){
char s1[]="hjxh dwh v vxxpde,mmo ijzr yfcz hg pbzrxdvgqij rid stl mc zspm vfvuu vb uwu spmwzh.";
long long a[100];
a[0]=a[1]=1;
for(int i=2;i<100;++i) a[i]=a[i-1]+a[i-2];
int c=0,n=strlen(s1);
char s2[100]; //题目存放在s2
for(int i=0;i<n;++i){
if(s1[i]==' '||s1[i]==','||s1[i]=='.') s2[i]=s1[i];
else{
int b=a[c++]%26;
if(s1[i]-b<'a') s2[i]=s1[i]+26-b;
else s2[i]=s1[i]-b;
}
}
s2[n]='\0';
printf("%s\n",s2);
}
题意:给定一个long long范围内的整数,求各位数的和。
此题坑点:
int -2147483648~2147483647
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
由取值范围可知,不可直接对-9223372036854775808求绝对值,会溢出,可以采取特判,也可以直接当做字符串处理。
AC代码:
#include<cstdio>
#include<cstring>
void getItem(){
char s1[]="hjxh dwh v vxxpde,mmo ijzr yfcz hg pbzrxdvgqij rid stl mc zspm vfvuu vb uwu spmwzh.";
long long a[100];
a[0]=a[1]=1;
for(int i=2;i<100;++i) a[i]=a[i-1]+a[i-2];
int c=0,n=strlen(s1);
char s2[100]; //题目存放在s2
for(int i=0;i<n;++i){
if(s1[i]==' '||s1[i]==','||s1[i]=='.') s2[i]=s1[i];
else{
int b=a[c++]%26;
if(s1[i]-b<'a') s2[i]=s1[i]+26-b;
else s2[i]=s1[i]-b;
}
}
s2[n]='\0';
//printf("%s\n",s2);
}
int getSum(char *s){
int n=strlen(s);
int i=0;
if(s[0]=='-') i=1;
int ans=0;
for(;i<n;++i){
ans+=s[i]-'0';
}
return ans;
}
int main(){
//getItem(); //题意:求给定数字各位的和
char s[30];
while(scanf("%s",s)==1){
printf("%d\n",getSum(s));
}
return 0;
}
如有不当之处欢迎指出!