Uriel's Corner

Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
posts - 0, comments - 50, trackbacks - 0, articles - 594
还行,一般难度。。不过第二题死活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 
= (-- sqrt(b * b - 4 * a * c)) / (2 * a);
            t2 
= (-+ 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[] = {235711131719232931374143475359
    
6167717379838997101103107109113127131
    
137139149151157163167173179181191193197
    
199211223227229233239241251257263269271
    
277281283293307311313317331337347349353
    
359367373379383389397401409419421431433
    
439443449457461463467479487491499};
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, 
0sizeof(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
***************************************************************
*/

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理