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


查看5道真题和解析