自我标记:静态函数的编辑和使用
辣鸡小玲的题解
UVA300 JAVA版
Maya Calendar
不算太水的水题,因为要处理很多细节
这题,小玲第一次写了函数,一写就写了俩
还是算法没处理好的问题,导致第一次WA了,看了室友的代码才改过来。
import java.util.*;
public class Main {
// 第一个函数,取得Haab年历的日期是世界上第几天
public static int GetDaycounterOfHaab(int day, String month, int year) {
int counter = 0;
counter = year * 365 + day;
// 处理月份问题噢
String MonName[] = { "pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin",
"mol", "chen", "yax", "zac", "ceh","mac", "kankin", "muan", "pax", "koyab",
"cumhu", "uayet" };
int i = 0;
for (i = 0; i < 19; i++)// 确定是第几个月
{
if (MonName[i].equals(month))
break;
}
counter += i * 20;// 标号为0-18刚好代表过去了0-18个月,第19个月过不去
return counter;
}
// 第二个函数,把世界上的第n天,转换成Tzolkin年历的表示方式,用String返回
public static String GetCalendarOfTzolkin(int n) {
int day = 0;
String dayWord = null;
int year = 0;
year = n / 260;
n = n % 260;
day = n % 13+1;//Haab的天数是从0开始算的,但是Tzolkin是从1开始算的
String DayName[] = { "imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik",
"lamat", "muluk", "ok", "chuen","eb", "ben", "ix", "mem", "cib", "caban",
"eznab", "canac", "ahau" };
n = n % 20;//n只会出现0-19的数字,正好对应了DayName的下标
dayWord = DayName[n];
String s_day = String.valueOf(day);
String s_year = String.valueOf(year);
String str;// 储存返回值噢
str = s_day + ' ' + dayWord + ' ' + s_year;
return str;
}
public static void main(String args[]) {
// 小玲要写他的第一个JAVA函数了
//函数写好了,现在是调用阶段
//拆分读入
int t;//t组测试数据
int day;
String s_day;
String month;
int year;
String point;
Scanner reader = new Scanner(System.in);
t=reader.nextInt();
System.out.println(t);
while(t>0) {//MARKⅠ
s_day=reader.next();//带.的day后续要进行分离
int i=0;
day=0;
for(i=0;i<s_day.length()-1;i++) {
day=day*10+s_day.charAt(i)-'0';
}
month=reader.next();
year=reader.nextInt();
int n;
n=GetDaycounterOfHaab(day,month,year);
String s;
s=GetCalendarOfTzolkin(n);
System.out.println(s);
t--;
}
}
}
MARKⅠ
JAVA是不能while(n- -)的
因为while()的括号里要返回一个布尔类型的数,所以要改成while(n>0),然后把n–放在循环里。
MARKⅠ ending
MARK Ⅱ 对于题目的摘录
再附一个,我读题的时候的小摘吧,对题目进行了提炼翻译,因为这题有点繁琐。
Haab历法, 有19个月,365天
前18个月有20天,月份名字:
pop, no, zip, zotz, tzec, xul, yoxkin, mol, chen, yax, zac, ceh, mac, kankin, muan, pax,
koyab, cumhu
天数是从0到19
最后一个月:
名叫 uayet 有5天,从0数到4
Tzolkin历法,13个时期,每个时期20天长,也就是260天
这20天的名字由13个数字和20个单词组成:
1-13
imix, ik, akbal, kan, chicchan,
cimi, manik, lamat, muluk, ok, chuen, eb, ben, ix, mem, cib, caban, eznab, canac, ahau
例如:
1 imix, 2 ik, 3 akbal, 4 kan, 5 chicchan, 6 cimi, 7 manik, 8 lamat, 9 muluk, 10 ok, 11 chuen,
12 eb,13 ben, 1 ix, 2 mem, 3 cib, 4 caban, 5 eznab, 6 canac, 7 ahau,
and again in the next period 8 imix, 9 ik, 10 akbal…
世界的第一天:
Haab: 0. pop 0
Tzolkin: 1 imix 0
代码目标:转换Haab年历到Tzolkin年历
输入:Haab年历的 NumberOfTheDay. Month Year
输出:Tzolkin年历的 Number NameOfTheDay Year
MARKⅡ ending
MARKⅢ 关于静态函数和非静态函数的区别
静态方法和实例方法的区别主要体现在两个方面:
在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
这题两个函数在最初的时候,我是把他们放在大Main的前面的,另建立了一个Function对象,但是在调用的时候,返回值出了点问题,具体是啥我也不太懂,查了查百度,Java的函数长这样,我就这样搞了,至于静态不静态当时也没想太多,现在看了这段话也只是懂一点点,嗐,慢慢成长吧。