还行,一般难度。。不过第二题死活AC不能啊。。
1. 二次方程计算器
感觉数据很弱。。各种BT情况(空格,X*X之类的case等。。)都没有考虑,出了sample就过了。。
话说代码长度恰好2000B。。。- -||
//2011年上海交通大学计算机研究生机题 二次方程计算器
#include<ctype.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
double a, b, c, t1, t2;
char s[1010];
int main() {
int i, fg;
double tp;
while(gets(s) != NULL) {
fg = 0;
a = b = c = tp = 0.0;
for(i = 0; s[i]; ++i) {
if(isdigit(s[i])) {
tp = 0.0;
while(s[i] && isdigit(s[i])) {
tp = tp * 10 + s[i] - '0';
++i;
}
if(s[i] && (s[i] == 'x' || s[i] == 'X')) {
--i; continue;
}
else {
--i;
if(fg) c += -tp;
else
c += tp;
}
}
else if(s[i] == '-') {
++i;
if(isdigit(s[i])) {
tp = 0.0;
while(s[i] && isdigit(s[i])) {
tp = tp * 10 + s[i] - '0';
++i;
}
tp *= -1;
if(s[i] && (s[i] == 'x' || s[i] == 'X')) {
--i; continue;
}
else {
--i;
if(fg) c += -tp;
else
c += tp;
}
}
else {
tp = -1;
--i;
}
}
else if(s[i] == '+') continue;
else {
if(s[i] == '=') {
fg = 1;
continue;
}
else if(s[i] == 'x' || s[i] == 'X') {
++i;
if(s[i] == '^') {
++i;
if(tp == 0) tp = 1;
if(fg) a += -tp;
else
a += tp;
}
else {
--i;
if(tp == 0) tp = 1;
if(fg) b += -tp;
else
b += tp;
}
}
tp = 0.0;
}
}
//printf("a=%f b=%f c=%f\n", a, b, c);
if(b * b >= 4 * a * c) {
t1 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
t2 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
printf("%.2lf %.2lf\n", t1, t2);
}
else
puts("No Solution");
}
return 0;
}
2. 整除问题
WA到死啊。。
我的思路是找出500以内所有质数,预处理出从1到1000每个数的阶乘的各质因子的个数,然后对于每个case,找出n!的各质因子个数,计算a的各质因子个数,看n!的各质因子数能满足几个a的需要,此即为k值。。不知思路有啥问题没。。
想想要是到时候机试就这么1,2道题,万一哪道卡死就悲剧了。。(最近几天要多拜拜代码之神。。保佑我别卡题。。= =)
WA的代码先晒这里。。路过的大牛不吝赐教啊。。Orz
//2011年上海交通大学计算机研究生机题 整除问题
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define INF 0x3f3f3f3f
int pr[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59,
61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131,
137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197,
199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271,
277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353,
359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433,
439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499};
int nt[40], n, a, pre[1010][100], fg[100];
int main() {
int i, j, k, tp, t;
for(i = 0; i < 95; ++i) pre[1][i] = 0;
for(i = 2; i <= 1000; ++i) {
t = i;
for(j = 0; j < 95; ++j) {
pre[i][j] = pre[i - 1][j];
if(t % pr[j] == 0) {
while(t % pr[j] == 0) {
t /= pr[j];
pre[i][j]++;
}
}
}
}
scanf("%d %d", &n, &a);
memset(fg, 0, sizeof(fg));
for(i = 0; i < 95; ++i) {
if(a < pr[i]) break;
if(a % pr[i] == 0) {
while(a % pr[i] == 0) {
a /= pr[i];
fg[i]++;
}
}
}
k = INF;
for(i = 0; i < 95; ++i) {
if(!fg[i]) continue;
tp = pre[n][i] / fg[i];
if(tp < k) {
k = tp;
}
}
printf("%d\n", k);
return 0;
}
/**************************************************************
Problem: 1104
User: Uriel
Language: C++
Result: Wrong Answer
****************************************************************/