OJ刷题--1004: 不明飞行物(ufo)

1.题目

1.1题目描述

一颗彗星的后面有一个不明飞行物(UFO),这个UFO经常到地球上来寻找忠实的追随者,把他们带到宇宙中去。但由于舱内空间有限,它们每一趟只能带一组追随者。尽管如此,外星人仍然想出了一个妙法来决定带谁走:以A代表1,B代表2,……Z代表26,USACO即21*19*1*3*15=17955,倘若此组人的组名所代表的数字与彗星的名字所代表的数字分别除以47,余数相同,则彗星名与组名相匹配,UFO带此组人飞向宇宙,余数不同则不匹配,故不带。
 
写一程序,打印出彗星名与组名是否相匹配,是打印“GO”,否打印“STAY”;同时打印出两者的余数。

1.2输入

输入文件包含两行,第一行为慧星名,第二行为组名。数据文件名由键盘输入。

1.3输出

由屏幕显示是否匹配的信息,下一行显示两者的余数。

1.4样例输入

COMETHALEBOPP
HEAVENSGATE

1.5样例输出

GO
r1=r2=17

2.题解

2.1思路

Step1.输入两个字符串,最后通过convert()和multimodo()函数返回余数。

Step2.判断两个返回的余数是否相同,若是,则输出GO和余数,若不是,则输出STAY和余数。

注意:如果字符串特别长,而且里面的字符都比较大,那么连乘得到的结果会非常大,可能会溢出导致最后的余数出错,考虑到求余有性质:
(a * b) mod c = (a mod c) * (b mod c),那么每求一次乘积就可以求一次余(具体可参见代码)。

2.2代码

(用C写的,有更好的写法还请大家指出)

#include

int convert(char a);
int multimodo(char a[]);

int main(void)
{
    char comet[1000];
    char follow[1000];
    int r1, r2;
	
	r1 = multimodo(comet);
	r2 = multimodo(follow);
	
	if (r1==r2)//判断两个返回的余数是否相同
	{
		printf("GO\n");
		printf("r1=r2=%d", r1);
	}	
	else
	{
		printf("STAY\n");
		printf("r1=%d r2=%d", r1,r2);
	}
	return 0;    
}
//英文和数字进行转化 
int convert(char a)
{
	int t = (int)(a) - 64;

	return t;
}
//转换后的连乘和求余运算 
int multimodo(char a[])
{
	int i;
	int mul = 1;
	for (i=0; i<1000; i++)
	{
		scanf("%c", &a[i]);
		if (a[i] == '\n')
			break;
		mul = ( mul * convert(a[i]) )%47;
		
	}
	
	return mul;
}

你可能感兴趣的:(算法刷题笔记,c语言)