|
Posted on 2011-08-27 03:07 Uriel 阅读(279) 评论(0) 编辑 收藏 引用 所属分类: 考研&保研复试上机题
这套两道题。。第二道难度可以。。 1. 手机键盘 这题竟然木有图片。。还得找来手机对照。。题目本身木有难度。。
//2008年清华大学计算机研究生机试题 手机键盘
#include<stdio.h> #include<stdlib.h> #include<string.h>
int a[] = {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4}; int t[] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8}; char s[110];
int main() { int i, ans; while(gets(s) != NULL) { ans = 0; for(i = 0; s[i]; ++i) { if(!i) ans += a[s[i] - 'a']; else { ans += a[s[i] - 'a'] + 2 * (t[s[i] - 'a'] == t[s[i - 1] - 'a']); } } printf("%d\n", ans); } return 0; } 2. 进制转换 这题木有给范围。。一开始也没往那方面想, 总以为是输出的大小写不对。。结果WA到哭。。还无耻的上小号乱刷。。主号的AC率从77跌至60+。。 想到可能要用大数之后。。又用JAVA偷懒了。。结果果断主号和小号垫底。。 膜拜此题用C写900+B的大牛 8.27: 膜拜完大牛代码。。果然巧妙。。下次再不偷懒用JAVA了。。
//2008年清华大学计算机研究生机试题 进制转换
import java.math.*; import java.util.*;
public class Main { public static void main(String args[]) { int m, n, i, l, k; String ss; char r[] = new char[1000]; char s[] = new char[1000]; BigInteger cnt; Scanner cin = new Scanner(System.in); while(cin.hasNext()) { m = cin.nextInt(); n = cin.nextInt(); ss = cin.next(); l = ss.length(); s = ss.toCharArray(); cnt = BigInteger.ZERO; for(i = 0; i < l; ++i) { cnt = cnt.multiply(BigInteger.valueOf(m)); if(s[i] >= 'A' && s[i] <= 'Z') cnt = cnt.add(BigInteger.valueOf(s[i] - 'A' + 10)); else if(s[i] >= 'a' && s[i] <= 'z') cnt = cnt.add(BigInteger.valueOf(s[i] - 'a' + 10)); else if(s[i] >= '0' && s[i] <= '9') cnt = cnt.add(BigInteger.valueOf(s[i] - '0')); } k = 0; if(cnt.compareTo(BigInteger.ZERO) == 0) { System.out.println("0"); } else { while(cnt.compareTo(BigInteger.ZERO) > 0) { int tp = (cnt.mod(BigInteger.valueOf(n))).intValue(); if(tp < 10) r[k] = (char)(tp + '0'); else r[k] = (char)(tp + 'a' - 10); ++k; cnt = cnt.divide(BigInteger.valueOf(n)); } for(i = k - 1; i >= 0; --i) System.out.print(r[i]); System.out.println(""); } } } }
|