上海交通大学11年机考复试题

明天去交大保研复试,这是一个意外的惊喜,之前都没想到......

http://ac.jobdu.com/problem.php?pid=1103

这一题我坑在求根公式忘了,外加交换次序没对


题目描述:

设计一个二次方程计算器

输入:

每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。

输出:

每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。

样例输入:
x^2+x=3x+4
样例输出:
-1.24 3.24
来源:
2011年上海交通大学计算机研究生机试真题
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>

using namespace std;

bool isNum(char c){
    if(c >= '0' && c<='9')
        return 1;
    else
        return 0;
}

bool isC(char c){
    if(c == 'x' || c == '^')return 1;
    return 0;
}

string changeStart(string in){
    if(in[0] == '-')return in;
    string ret;
    if(isNum(in[0])){
        ret = "+";
        ret = ret + in;
        return ret;
    }
    if(isC(in[0])){
        ret = "+1";
        ret = ret + in;
        return ret;
    }
}

string rev(string str){
    for(int i=0;i<str.size();i++){
        if(str[i] == '+') {
            str[i] = '-';
            continue;
        }
        if(str[i] == '-') {
            str[i] = '+';
            continue;
        }
    }
    //cout << "str=" << str << endl;
    return str;
}

int getChange(string &in){
    in = changeStart(in);
    int pos = in.find("=");
    if(pos == in.npos
       )return 0;
    string ret = in.substr(0, pos);
    string right = changeStart(in.substr(pos+1));
    //cout << "right=" << right << " rev=" << right << endl;
    ret = ret + rev(right);
    in = ret;
    return 1;
}

void error(){
    //cout << "No Solution" << endl;
    printf("No Solution\n");
}

int Find(string s, string ret, int st){
    s = s.substr(st);
    return s.find(ret);
}

double strToInt(string s){
    double ret = 0.0;
    for(int i=0;i<s.size();i++){
        ret =  ret*10 + (double)(s[i] - '0');
    }
    return ret;
}

void cal(string in){
    double a=0.0,b=0.0,c=0.0;
    int ptr=0;
    while(ptr < in.size()){
        int flag = 1;
        if(in[ptr] == '-'){
            flag = -1;
        }
        ptr ++;
        int en = ptr;
        double tmp = 0.0;

        while(en < in.size() && isNum(in[en])){
            tmp = tmp*10 + (double)(in[en]-'0');
            en++;
        }
        //cout << "tmp=" << tmp << "  a=" << a << "  b=" << b << "  c=" << c << endl;
        if(en >= in.size()|| in[en] == '-' || in[en] == '+'){
            c = c + flag*tmp;
            ptr = en;
            continue;
        }
        if(in[en] == 'x'){
            if(en-1 >=0  && (in[en-1] == '-' || in[en-1] == '+' ) ){
                tmp = 1.0;
            }
            if(en+1 < in.size() && in[en+1] == '^'){
                a = a + flag*tmp;
                ptr = en + 3;
                continue;
            }else{
                b = b + flag*tmp;
                ptr = en + 1;
                continue;
            }
        }
    }
    double check = b*b - 4 * a * c;
    //cout << "finally " << "a=" << a << "  b=" << b << "  c=" << c << endl;
    //cout << "check=" << check << endl;

    if(check >=0.0){
        double re1 = (-b-sqrt(check))/(2.0*a);
        double re2 = (-b+sqrt(check))/(2.0*a);
        if(re1>re2)swap(re1,re2);
        printf("%.2lf %.2lf\n",re1, re2 );
    }else{
        error();
    }
}

void solve(string in){
    if(!getChange(in)){
        error();
        return;
    }
    //cout << in << endl;
    cal(in);
}

int main(){
    //freopen("201101.txt", "r", stdin);
    string in;
    while(cin >> in){
        solve(in);
    }
    return 0;
}

http://ac.jobdu.com/problem.php?pid=1104

这题我坑在,如果n<m 这个时候的处理。。。

题目1104:整除问题

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:4100

解决:1335

题目描述:

给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。

输入:

两个整数n(2<=n<=1000),a(2<=a<=1000)

输出:

一个整数.

样例输入:
6 10
样例输出:
1
来源:
2011年上海交通大学计算机研究生机试真题
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>

using namespace std;

const int SIZE = 1001;
int vis[SIZE];
int prime[SIZE];
int getPrime(int n){
    memset(vis, 0, sizeof(vis));
    //int n = SIZE-1;
	int i;
    for(i=2;i<=n;i++){
        for(int j=i*2; j<=n;j+=i)
            vis[j] = 1;
    }
    int k=0;
    for(i=2;i<=n;i++)
        if(!vis[i])
            prime[k++] = i;
    return k;
}

int n,a;
int pos[SIZE];
int numprime;
int gn[SIZE][SIZE];
int an[SIZE];

void getN(int limit){
	int i;
	for( i=0;i<limit;i++)
		gn[0][i] = gn[1][i] = 0;
	for( i=2;i<limit;i++){
		int t = i;

		for(int j=0;j<numprime;j++){
			gn[i][prime[j]] = gn[i-1][prime[j]];
			while(t > 1 && t>=prime[j] && t%prime[j] == 0){
				gn[i][ prime[j] ] ++;
				t/=prime[j];
			}
			//if(t < prime[j])break;
		}

		if(t != 1)gn[i][ t ]++; /
	}
}

void init(){
	numprime = getPrime(SIZE-1);
	getN(SIZE);

}

void getan(){
	memset(an,0,sizeof(an));
	int t = a;
	for(int i=0;i<numprime && t>= prime[i] ;i++){
		while(t >1 && t>= prime[i] && t%prime[i] == 0){
			an[prime[i]] ++;
			t /= prime[i];
		}

	}
	if(t != 1)an[t]++;
}

int main(){
	init();
	/*for(int c=0;c<15;c++){
		printf("%d=%d\n",c,prime[c]);
	}*/
	while(~scanf("%d%d", &n, &a)){
		int mn = 2000000000;
		getan();
		int ans=0;
		int flag=1;
		int i;
		/*for(i=0;i<11;i++){
			cout << "i=" << i << "  an=" << an[i] << "  gn" << gn[n][i] << endl; 
		}*/
		

		for(i = 0; i< numprime; i++){
			if(an[prime[i]] == 0)continue;
			if(an[prime[i]] > gn[n][prime[i]]){
				ans = 0;
				//mn = 
				break;
			}
			//mn = min(mn, (int)gn[n][prime[i]]/an[prime[i]]);
			int tmp =  (int)gn[n][prime[i]]/an[prime[i]];
			if(tmp < mn){
				mn = tmp;
				ans = mn;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值