引き算(蘇州大学コンピュータ学院3月試合及びブルーブリッジカップウォーミングアップ試合)

2572 ワード

減算
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
2つの26進数を与えて、それらの中の大きい数から小数の値を減算します.
ここで、数の各ビットは小文字の英字であり、各英字と0~25の対応関係を与え、26文字と26文字の間の1つ1つのマッピングを保証する.
Input
第1の挙動は整数T(1≦T≦100)であり、T組の入力データが共有されていることを示す.
各グループのデータについて、入力データは2行を占めます.
1行目は、小文字の英字からなる長さ26の文字列sであり、a〜zの配列であり、i番目の文字は数字i−1に対応する.
2行目は、この方法で表される26進数(数の値は26^10000未満)の2つであり、0に対応する数を除いて、2つの数の最初のアルファベットは0に対応しないアルファベットである.
Output
各グループのデータについて、26進数を2つの数の差で出力します.表示方法は入力データに与えられたマッピング方法と同じで、0に対応する数を除いて、出力結果の頭文字は0に対応するアルファベットではありません.
Sample Input
2
abcdefghijklmnopqrstuvwxyz
dcba hgfe
qwertyuiopasdfghjklzxcvbnm
abc def

Sample Output
eeee
wtl

Author
奚政
Statistic | Submit | Back
水を比較する問題だと思います. 
気をつければいい
1.2つの数が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("
"); } return 0; }