ECNU 软工机试2019
A. 约瑟夫问题
队列模拟。
代码:
#include <iostream> #include <queue> using namespace std; int main() { int l; cin>>l; while(l--){ int n,m,k; cin>>n>>m>>k; queue<int> q; for(int j=1;j<=n;j++) q.push(j); while(k--){ int count=1; while(count!=m){ int t=q.front(); q.pop(); q.push(t); count++; } int t=q.front(); q.pop(); if(k==0) cout<<t<<endl; } } }
B. 合法变量
#include <iostream> using namespace std; bool IsDig(char c){ if(c>='0' && c<='9') return true; else return false; } bool IsXiahuaxian(char c){ if(c=='_') return true; else return false; } bool IsLetter(char c){ if((c>='a' && c<='z')||(c>='A' && c<='Z')) return true; else return false; } bool IsHefa(string str){ if(IsLetter(str[0])==0 && IsXiahuaxian(str[0])==0) return false; for(int i=1;i<str.size();i++) if(IsDig(str[i])==0 && IsXiahuaxian(str[i])==0 && IsLetter(str[i])==0) return false; return true; } int main() { string str; getline(cin,str); if(IsHefa(str)==1) cout<<"yes"; else cout<<"no"; }
C. 晚饭吃什么
大整数运算。
代码:
#include <iostream> #include <vector> using namespace std; vector<int> ToBigInt(string str){ vector<int> num; for(int i=str.size()-1;i>=0;i--) num.push_back(str[i]-'0'); return num; } int compare(vector<int> a,vector<int> b){ if(a.size()>b.size()) return 1; else if(a.size()<b.size()) return -1; else{ for(int i=a.size()-1;i>=0;i--){ if(a[i]>b[i]) return 1; else if(a[i]<b[i]) return -1; } return 0; } } vector<int> sub(vector<int> a,vector<int> b){ vector<int> c; if(a.size()>b.size()) b.insert(b.end(),a.size()-b.size(),0); if(a.size()<b.size()) a.insert(a.end(),b.size()-a.size(),0); int carry=0; for(int i=0;i<a.size();i++){ c.push_back((a[i]+10-b[i]-carry)%10); if(a[i]>=b[i]+carry) carry=0; else carry=1; } for(int i=c.size()-1;c[i]==0;i--) c.pop_back(); return c; } int main() { int k; cin>>k; while(k--){ string str1,str2; cin>>str1>>str2; vector<int> a= ToBigInt(str1),b= ToBigInt(str2); while(compare(a,b)==1){ a=sub(a,b); } for(int i=a.size()-1;i>=0;i--) cout<<a[i]; cout<<endl; } }
D. 津津的数字压缩法
代码:
#include <iostream> #include <vector> using namespace std; vector<int> ToDig(string str){ vector<int> res; for(int i=0;i<str.size();i++) res.push_back(str[i]-'0'); res.push_back(-1); return res; } vector<int> Change(vector<int> a){ vector<int> b; int count=1; for(int i=0;i<a.size()-1;i++){ if(a[i]!=a[i+1]){ b.push_back(count); b.push_back(a[i]); count=1; } else{ count++; } } return b; } int main(){ string str; cin>>str; vector<int> a= ToDig(str); vector<int> b= Change(a); for(int i=0;i<b.size();i++) cout<<b[i]; }
E. 财务危机
这题不会。
F. 超越方程
求导+二分法的思想,不知道能不能AC。
代码:
#include <iostream> #include <cstdio> #include <cmath> using namespace std; double k,m,p,a,b; double f_(double x){ return k*p* pow(x,p-1)- pow(m,x)* log(m); } /*double f(double x){ return k* pow(x,p)- pow(m,x); }*/ int main(){ int l; cin>>l; while(l--){ scanf("%lf",&k); scanf("%lf",&m); scanf("%lf",&p); scanf("%lf",&a); scanf("%lf",&b); double mid; for(int i=0;i<10000;i++){ mid=(a+b)/2; if(f_(mid)==0) break; else if(f_(a)*f_(mid)<0) b=mid; else a=mid; } printf("%.8f\n",mid); } }
G. 找数
这题也不会。
注:
本文部分内容来自:https://malic.xyz/archives/128