明天去交大保研复试,这是一个意外的惊喜,之前都没想到......
http://ac.jobdu.com/problem.php?pid=1103
这一题我坑在求根公式忘了,外加交换次序没对
-
题目描述:
-
设计一个二次方程计算器
-
输入:
-
每个案例是关于x的一个二次方程表达式,为了简单,每个系数都是整数形式。
-
输出:
-
每个案例输出两个实数(由小到大输出,中间由空格隔开),保留两位小数;如果无解,则输出“No Solution”。
-
样例输入:
-
x^2+x=3x+4
-
样例输出:
-
-1.24 3.24
#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:整除问题#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;
}