ACMICPC南太平洋赛区试题解析1Word格式.docx
《ACMICPC南太平洋赛区试题解析1Word格式.docx》由会员分享,可在线阅读,更多相关《ACMICPC南太平洋赛区试题解析1Word格式.docx(7页珍藏版)》请在冰豆网上搜索。
![ACMICPC南太平洋赛区试题解析1Word格式.docx](https://file1.bdocx.com/fileroot1/2023-2/4/2572add3-ca46-480f-bf58-9f56d4e83736/2572add3-ca46-480f-bf58-9f56d4e837361.gif)
valuetoitsright,asinthefollowingexamples:
)@%is1*62+3*6+0=36+18+0=54
$~~is4*63+(–1)*62+2*6+2=864–36+12+2=842
$~~is(–1)*62+2*6+2=–36+12+2=-22
YourtaskistotakeWacmiannumbersandrepresentthemasstandardbase10
numbers.
P1-ACMSPPC2of2Saturday,20/09/2003
INPUTFORMAT
InputconsistsofWacmiannumbers,oneperline.Eachnumberconsistsofa
sequenceof1to10Wacmiandigits.Asingle‘#’onalinebyitselfindicatesthe
endofinput.
SAMPLEINPUT:
)@%
$~~
%
#
OUTPUTFORMAT
Outputwillbethecorrespondingdecimalnumbers,oneperline.
SAMPLEOUTPUT:
54
842
-22
0
这里我们提供出来本题的中文对照:
Wacmian数字
在假设的Wacmahara无人沙漠里,一个非普通人组成的部落被发现了。
Wacmians的每个手上仅有两个手指和一个拇指,并且他们发明了自己的数字系统。
他们使用的数字和用来表示数字的符号都很奇特,但是人类学家已经能够以用下面的方法描述它们:
%--0
)--1
~--2
@--3
--4
\--5
$---1(没错,他们甚至有负数)
如你所愿,他们的系统是以6为基础的,每位上的数值达到6就像该位的左边进位,如同随后的例子:
)@%表示1*6^2+3*6+0=36+18+0=54
$~~表示4*6^3+(-1)*6^2+2*6+2=864-36+12+2=842
$~~表示(-1)*6^2+2*6+2=-36+12+2=-22
你的任务是把Wacmian数字解释成标准的10进制数字。
输入格式
输入包括Wacmian数字,每行一个。
每个数字由1至10个有顺序的Wacmian数字组成。
一个单独的#占用一行,它标志输入结束。
输入举例:
输出格式
输出相应的是进制数字,每行一个。
输出举例:
本题的解答如下:
#include<
stdio.h>
io.h>
intGetData(int*digit,FILE*fp)
{
chartemp;
inti=0;
//使用temp记录从input.in文件中逐个读出的字符
temp=fgetc(fp);
//如果为回车符,表示该数的读取已经结束了
while(temp!
='
\n'
)
switch(temp)
case'
%'
:
digit[i]=0;
break;
)'
digit[i]=1;
~'
digit[i]=2;
@'
digit[i]=3;
'
digit[i]=4;
/'
digit[i]=5;
$'
digit[i]=-1;
#'
return-1;
//让函数返回-1表示input.in文件结束
}
//digit[10]用来统计数中的位数
digit[10]=i+1;
i++;
//数组下标增加1
//读入下一个字符
return0;
voidmain()
//题目中给每个数最多只有10位
//所以数组定义11位
//前10位保存每位的数字
//最后一位统计位数
intdigit[11];
longnumber=0;
//考虑到极值状况,采用long类型
longtemp=1;
inti,j;
FILE*fpInput,*fpOutput;
fpInput=fopen("
input.in"
"
r"
);
fpOutput=fopen("
output.out"
w"
digit[10]=0;
while(GetData(digit,fpInput)!
=-1)
for(i=0;
i<
digit[10];
i++)
for(j=0;
j<
digit[10]-i-1;
j++)temp*=6;
number+=(digit[i]*temp);
temp=1;
//将每一位转换成10进制后都需要为temp初始化
//以便下一位的转换时使用
fprintf(fpOutput,"
%ld\n"
number);
number=0;
//每个数字转换完成后number同样需要重新初始化
fclose(fpInput);
fclose(fpOutput);
}
FeedBack:
#2003年ACM-ICPC南太平洋赛区试题解析-1
2004-09-1316:
43|lili
#include
<
int
GetData(int
*digit,FILE
*fp)
{
char
temp;
i=0;
//使用temp记录从input.in文件中逐个读出的字符
temp
=
fgetc(fp);
//如果为回车符,表示该数的读取已经结束了
while(temp
!
)
switch
(temp)
case
digit[i]
0;
1;
2;
3;
4;
5;
-1;
return
//
让函数返回
-1
表示input.in文件结束
}
//digit[10]用来统计数中的位数
digit[10]
i+1;
//数组下标增加
1
//读入下一个字符
void
main()
//题目中给每个数最多只有10位
//所以数组定义11位
//前10位保存每位的数字
//最后一位统计位数
digit[11];
long
number
//考虑到极值状况,采用long类型
i,j;
FILE
*fpInput,*fpOutput;
fpInput
fopen(
"
fpOutput
fopen("
while(GetData(digit,fpInput)
-1)
i<
i++)
j<
j++)
*=
6;
+=
(digit[i]*temp);
//将每一位转换成10进制后都需要为temp初始化
//以便下一位的转换时使用
//每个数字转换完成后number同样需要重新初始化