快速幂——你的飞碟在这儿Your Ride Is Here

你的飞碟在这儿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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值