引き算(蘇州大学コンピュータ学院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
Sample Output
Author
奚政
Statistic | Submit | Back
水を比較する問題だと思います.
気をつければいい
1.2つの数が0に減算された場合
2.例えば1000-1
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;
}