ACMICPC南太平洋赛区试题解析1.docx
《ACMICPC南太平洋赛区试题解析1.docx》由会员分享,可在线阅读,更多相关《ACMICPC南太平洋赛区试题解析1.docx(7页珍藏版)》请在冰豆网上搜索。
ACMICPC南太平洋赛区试题解析1
2003年ACM-ICPC南太平洋赛区试题解析-1
ACM国际大学生程序设计竞赛由国际计算机学界著名的ACM学会(AssociationforComputerMachinery)主办,是世界上规模最大、水平最高的国际大学生程序竞赛。
本文作为CSTC团队之ACM培训的启动工程训练内容,请从此题入手,开始你们痛并快乐着的ACM之旅。
此题虽为ACM比赛用题,却非常简单,没有什么特别之处,不牵扯数据结构,实为初学者建立自信心的灵丹妙药。
英文原文
P1-ACMSPPC1of2Saturday,20/09/2003
PROBLEM1-WACMIANNUMBERS
InthesupposedlyuninhabitedWacmaharaDesert,atribeofunusualpeoplehas
beendiscovered.TheWacmianshaveonly2fingersandathumboneachhand,
andhaveinventedtheirownnumberingsystem.Thedigitstheyuseandthe
symbolstheyusefordigitsarequiteunusual,butanthropologistshavebeenable
torepresentthemasfollows:
%represents0
)represents1
~represents2
@represents3
?
represents4
\represents5
$represents-1(yes,theyevenhaveanegativedigit)
Asyoumayexpect,theirsystemisbase6whereeachplacevalueis6timesthe
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数字组成。
一个单独的#占用一行,它标志输入结束。
输入举例:
)@%
?
$~~
$~~
%
#
输出格式
输出相应的是进制数字,每行一个。
输出举例:
54
842
-22
0
本题的解答如下:
#include
#include
intGetData(int*digit,FILE*fp)
{
chartemp;
inti=0;
//使用temp记录从input.in文件中逐个读出的字符
temp=fgetc(fp);
//如果为回车符,表示该数的读取已经结束了
while(temp!
='\n')
{
switch(temp)
{
case'%':
digit[i]=0;break;
case')':
digit[i]=1;break;
case'~':
digit[i]=2;break;
case'@':
digit[i]=3;break;
case'?
':
digit[i]=4;break;
case'/':
digit[i]=5;break;
case'$':
digit[i]=-1;break;
case'#':
return-1;//让函数返回-1表示input.in文件结束
}
//digit[10]用来统计数中的位数
digit[10]=i+1;
i++;//数组下标增加1
//读入下一个字符
temp=fgetc(fp);
}
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{
for(j=0;jnumber+=(digit[i]*temp);
temp=1;
//将每一位转换成10进制后都需要为temp初始化
//以便下一位的转换时使用
}
fprintf(fpOutput,"%ld\n",number);
number=0;//每个数字转换完成后number同样需要重新初始化
}
fclose(fpInput);
fclose(fpOutput);
}
postedon2004-06-1219:
57monkeyking阅读(790)评论
(1) 编辑 收藏引用网摘所属分类:
原创
FeedBack:
#2003年ACM-ICPC南太平洋赛区试题解析-1
2004-09-1316:
43|lili
#include
#include
int GetData(int *digit,FILE *fp)
{
char temp;
int i=0;
//使用temp记录从input.in文件中逐个读出的字符
temp = fgetc(fp);
//如果为回车符,表示该数的读取已经结束了
while(temp !
='\n')
{
switch (temp)
{
case '%':
digit[i] = 0;break;
case ')':
digit[i] = 1;break;
case '~':
digit[i] = 2;break;
case '@':
digit[i] = 3;break;
case '?
':
digit[i] = 4;break;
case '/':
digit[i] = 5;break;
case '$':
digit[i] = -1;break;
case '#':
return -1; // 让函数返回 -1 表示input.in文件结束
}
//digit[10]用来统计数中的位数
digit[10] = i+1;
i++; //数组下标增加 1
//读入下一个字符
temp = fgetc(fp);
}
return 0;
}
void main()
{
//题目中给每个数最多只有10位
//所以数组定义11位
//前10位保存每位的数字
//最后一位统计位数
int digit[11];
long number = 0; //考虑到极值状况,采用long类型
long temp = 1;
int i,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{
for(j=0; jnumber += (digit[i]*temp);
temp = 1;
//将每一位转换成10进制后都需要为temp初始化
//以便下一位的转换时使用
}
fprintf(fpOutput,"%ld\n",number);
number = 0; //每个数字转换完成后number同样需要重新初始化
}
fclose(fpInput);
fclose(fpOutput);
}