我们分步来解题。
排列与组合
先用一个函数用来求阶乘,这是为了让后面的运算更简便。
int jiecheng(int n) {
if (n<0) return 0;
int res=1;
for (int i=2;i<=n;i++) res*=i;
return res;
}
然后计算 ,但是要特判 和 :
int sum_A(int n,int m) {
if (n<m||n<0||m<0) return 0;
return jiecheng(n)/jiecheng(n-m);
}
接着计算 ,还是需要特判:
int sum_C(int n,int m) {
if(n<m||n<0||m<0) return 0;
return jiecheng(n)/(jiecheng(m)*jiecheng(n-m));
}
有理数加法
很简单,但是注意题目中所说:
小数输出请不要使用 printf。
void rno(int n) {
while(n--){
int c;
cin>>c;
double sum=0.0;
for (int j=0;j<c;j++) {
double num;
cin>>num;
sum+=num;
}
cout<<fixed<<setprecision(5)<<sum<<endl;
}
}
进制转换
先定义一个字符串用来存余数。
判断这个数是不是负数,如果是,就让它变成它的相反数,最后在前面输出一个负号就行了。
然后短除:
while(d>0){
int cnt=d%e;//取余
res=a[cnt]+res;//添加余数
d=d/e;//除
}
所以代码就是:
string jinzhi(int d,int e){
if(e<2 or e>=36) return "Error";
if(d==0) return "0";
string a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string res="";
bool flag=false;
if(d<0){
flag=true;
d=-d;
}
while(d>0){
int cnt=d%e;
res=a[cnt]+res;
d=d/e;
}
if (flag) res="-"+res;
return res;
}
有理数乘方
使用快速幂模版就行:
void pon(int n) {
for(int i=0;i<n;i++) {
int a,b;
cin>>a>>b;
int res=1;
for(int j=0;j<b;j++) res*=a;
cout<<res<<endl;
}
}
那么完整代码就是:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T;
int jiecheng(int n) {
if (n<0) return 0;
int res=1;
for (int i=2;i<=n;i++) res*=i;
return res;
}
int sum_A(int n,int m) {
if (n<m||n<0||m<0) return 0;
return jiecheng(n)/jiecheng(n-m);
}
int sum_C(int n,int m) {
if(n<m||n<0||m<0) return 0;
return jiecheng(n)/(jiecheng(m)*jiecheng(n-m));
}
string jinzhi(int d,int e){
if(e<2 or e>=36) return "Error";
if(d==0) return "0";
string a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string res="";
bool flag=false;
if(d<0){
flag=true;
d=-d;
}
while(d>0){
int cnt=d%e;
res=a[cnt]+res;
d=d/e;
}
if (flag) res="-"+res;
return res;
}
void pac() {
char c;
cin>>c;
int n,m;
cin>>n>>m;
if(c=='A') cout<<sum_A(n,m)<<endl;
else if(c=='C') cout<<sum_C(n,m)<<endl;
}
void rno(int n) {
while(n--){
int c;
cin>>c;
double sum=0.0;
for (int j=0;j<c;j++) {
double num;
cin>>num;
sum+=num;
}
cout<<fixed<<setprecision(5)<<sum<<endl;
}
}
void dc(int n) {
for(int i=0;i<n;i++) {
int d,e;
cin>>d>>e;
cout<<jinzhi(d,e)<<endl;
}
}
void pon(int n) {
for(int i=0;i<n;i++) {
int a,b;
cin>>a>>b;
int res=1;
for(int j=0;j<b;j++) res*=a;
cout<<res<<endl;
}
}
signed main(void) {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>T;
while(T--){
string s;
int cnt;
cin>>s ;
if(s=="pac") pac();
else{
cin>>cnt;
if(s=="rno") rno(cnt);
if(s=="dc") dc(cnt);
if(s=="pon") pon(cnt);
}
}
exit(0);
}
暂无评论