你的飞碟在这儿Your Ride Is Here
题目描述
众所周知,在每一个彗星后都有一只UFO。这些UFO时常来收集地球上的忠诚支持者。不幸的是,他们的飞碟每次出行都只能带上一组支持者。因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走。他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给这些彗星取的名字呢?)。关于如何搭配的细节会在下面告诉你;你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的UFO带走。
小组名和彗星名都以下列方式转换成一个数字:最终的数字就是名字中所有字母的积,其中A是1,Z是26。例如,USACO小组就是21×19×1×3×15=17955。如果小组的数字mod 47等于彗星的数字 mod 47,你就得告诉这个小组需要准备好被带走!(记住“ a mod b”是a除以b的余数;34 mod 10等于4)
写出一个程序,读入彗星名和小组名并算出用上面的方案能否将两个名字搭配起来,如果能搭配,就输出“GO”,否则输出“STAY”。小组名和彗星名均是没有空格或标点的一串大写字母(不超过60个字母)。
输入格式
第1行:一个长度不超过60的大写字母串,表示彗星的名字。
第2行:一个长度不超过60的大写字母串,表示队伍的名字。
输出格式
无
输入输出样例
输入 #1
COMETQ
HVNGAT
输出 #1
GO
输入 #2
ABSTAR
USACO
输出 #2
STAY
说明/提示
源自洛谷P1200
思路
1、字符是以ASCII码存储的,因此需要知道A—Z的码值,通过查ASCII码表可值,A—Z的码值为65—90。ASCII表
2、A—Z的码值转换成题目所要求的值后为1—26,且字符串长度最大为60,因此字母积的取值范围为1至2660,而int和long long的最大取值分别为231-1和264-1,不难看出字母积的是存在爆掉所用数据类型的内存空间的风险的,因此需要使用快速幂来防止爆内存同时优化运行速度。
3、用strlen函数获取字符串长度。
4、无论是否使用快速幂,都需要使用循环,因此在快速幂的时候,需要确定如何进行循环。
代码
#include<stdio.h>
#include<string.h>
int lol(char x[],int a)//快速幂模块(字符串,字符数)
{
int n=1,i;
//判断字符数是偶数还是奇数
if(a%2==0)//偶数时
{
i=0;
while(i<a)//以数组下标和字符数作为循环判断的依据
{
/*做积的时候,两个元素一组进行求积运算,可以使循环次数减半,
每次循环求一次模,可以防止爆掉int的内存空间。字符在存储时执
行ASCII码标准,大写字母的码值为65~90,题目需要的值为1~26,
减'A'可以得到0~25的值,再加1即可得到题目所需的值。*/
n=n*(x[i]-'A'+1)*(x[i+1]-'A'+1)%47;
i+=2;
}
}
else//奇数时
{
i=0;
while(i<a)
{
n=n*(x[i]-'A'+1)*(x[i+1]-'A'+1)%47;
i+=2;
}
//在奇数时,元素两两一组求积时会漏掉最后一个元素,所以要补上
n=n*(x[a-1]-'A'+1)%47;
}
return n;
}
int main()
{
char x[60],y[60];//定义字符型数组用于存放输入的字符串
int n=1,m=1,a,b;
scanf("%s\n%s",x,y);
//使用strlen函数获得字符串中的字符数
a=strlen(x);
b=strlen(y);
//使用快速幂计算输入的字符串的字母积对47的模
n=lol(x,a);
m=lol(y,b);
//判断字符串是否搭配
if(n==m)
printf("GO\n");
else
printf("STAY\n");
return 0;
}