减法 (苏州大学计算机学院三月月赛暨蓝桥杯热身赛)

减法

Time Limit : 10000/5000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 33   Accepted Submission(s) : 7

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

Problem Description

给出两个26进制数,求它们中大数减去小数的值;
其中数的每一位为一个小写的英文字母,并给出每个英文字母与 0~25 之间的对应关系,保证 26 个字母与 26 个数之间一一映射。

Input

第一行为一个整数 T (1 ≤ T ≤ 100),表示共有T组输入数据;

对于每组数据,输入数据占两行;
第一行是一个由小写英文字母组成的长度为 26 的字符串 s,为 a~z 的一个排列,第 i 个字母与数字 i-1 相对应。
第二行是两个按此方法表示的 26 进制数(数的值小于 26^10000),且除 0 所对应的数外,两个数首位字母不为 0 所对应的字母。

Output

对于每组数据,输出一个 26 进制数,为两个数的差,表示方法与输入数据中给出的映射方法相同,且除 0 所对应的数外,输出结果的首字母不为 0 所对应的字母。

Sample Input

2
abcdefghijklmnopqrstuvwxyz
dcba hgfe
qwertyuiopasdfghjklzxcvbnm
abc def

Sample Output

eeee
wtl

Author

奚政
Statistic | Submit | Back

应该是比较水的一道题了 

细心点就好

1.两个数相减为0的情况

2.例如1000-1

#include <stdio.h>
#include <string.h>
char word[30];
int tonum(char ch)
{
	for(int i=0;i<26;i++)
	if(word[i]==ch)
	return i;
}
int main()
{
	int ncase;
	char a[10005];
	char b[10005];
	char temp[10005];
	char result[10005];
	scanf("%d",&ncase);
	while(ncase--)
	{
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(temp,0,sizeof(temp));
		memset(result,0,sizeof(result));
		scanf(" %s %s %s",word,a,b);
		//使较大的数为a 较小的数为b 
		int len1=strlen(a);
		int len2=strlen(b);
		if(len1<len2)
		{
			strcpy(temp,a);
			strcpy(a,b);
			strcpy(b,temp);
		}
		else if(len1==len2)
		{
			for(int i=0;i<len1;i++)
			{
				if(tonum(a[i])<tonum(b[i]))
				{
					strcpy(temp,a);
					strcpy(a,b);
					strcpy(b,temp);
					break;
				}
				if(tonum(a[i])>tonum(b[i]))
				break;
			}
		}
		//计算a-b 
		int x;
		if(len1<len2)
		x=len1,len1=len2,len2=x;
		for(int i=len1-1,j=len2-1;i>=0;i--,j--)
		{
			int x1,x2;
			x1=tonum(a[i]);
			if(j>=0)
			x2=tonum(b[j]);
			else
			x2=0;
			if(x1>=x2)
			result[i]=word[x1-x2];
			else
			{
				result[i]=word[26+x1-x2];
				int k=i;
				while(tonum(a[k-1])==0)
				k--;
				for(int j=k;j<i;j++)
				a[j]=word[25];
				a[k-1]=word[tonum(a[k-1])-1];
			}
		}
		int left=-1;
		for(int i=0;i<len1;i++)
		if(tonum(result[i])!=0)
		{
			left=i;
			break;
		}
		//a==b的情况 
		if(left==-1)
		printf("%c",word[0]);
		else
		for(int i=left;i<len1;i++)
		printf("%c",result[i]);
		printf("\n");
	}
	return 0;
}



你可能感兴趣的:(减法 (苏州大学计算机学院三月月赛暨蓝桥杯热身赛))