问题描述:
给定n,m,任务是计算答案
输入
在第一行,有一个整数T表示测试用例的数量
然后在T行中跟随T个案例
每个case包含一个字符'A'或'C',两个整数分别代表n和m(1<=n,m<=10)
输出
对于每种情况,如果字符是'A',则计算A(m,n),如果字符是'C',则计算C(m,n)
样例输入
2
一个 10 10
C 4 2
样例输出
3628800
6
下面的这是代码
#include <stdio.h>
typedef long long ll; // 题目范围其实用不到long long但是还是觉得ll保险
ll A(ll a, ll b); // 计算排列数
ll B(ll a, ll b); // 计算组合数
ll jiecheng(ll n); // 计算阶乘
int main(void)
{
int test;
scanf("%d", &test);
while (test--)
{
char op[2]; // 为了方便读取所以定义了一个字符串
ll n, m;
scanf("%s", op);
scanf("%lld%lld", &n, &m);
if (op[0] == 'A')
printf("%lld\n", A(n, m));
else
printf("%lld\n", B(n, m));
}
return 0;
}
ll A(ll a, ll b)
{
ll ans = 1;
for (ll i = 0; i < b; i++, a--)
ans *= a;
return ans;
}
ll B(ll a, ll b)
{
return jiecheng(a) / (jiecheng(b) * jiecheng(a - b));
}
ll jiecheng(ll n)
{
ll ans = 1;
for (ll i = 1; i <= n; i++)
ans = ans * i;
return ans;
}
运行结果
望采纳,谢谢
要求请描述完整,A(m,n)和C(m,n)是什么?
参考链接 https://blog.csdn.net/baime3559/article/details/101621549
#include <stdio.h>
//计算n的阶乘
int jc(int n){
int i,res=1;
for(i=1;i<=n;i++){
res=res*i;
}
return res;
}
//计算排列数A(m,n)=n!/m!
int A(int m,int n){
return (jc(n)/jc(n-m));
}
//计算组合数
int C(int m,int n){
return (jc(n))/(jc(m)*jc(n-m));
}
int main(){
int T;
scanf("%d",&T);
char ch;
int n,m;
while(T--){
fflush(stdin);//去除换行符
scanf("%c%d%d",&ch,&n,&m);
if(ch=='A'){
printf("%d\n",A(m,n));
}else if(ch=='C'){
printf("%d\n",C(m,n));
}
}
}
struct DataInfo
{
char ch;
int m;
int n;
};
int A(int n,int m)
{
int i=0,sum=1;
for(i=0;i<m;i++)
{
sum=sum*n;
n--;
}
return sum;
}
int C(int n,int m)
{
int i=0,sum=0,sum1=0,sum2=1;
sum1=A(n,m);
for(i=1;i<m+1;i++)
sum2=i*sum2;
sum=sum1/sum2;
return sum;
}
int main()
{
int i=0,num=0,sum=0;
printf("请输入测试数组数量\n");
scanf("%d",&num);
struct Datainfo Data[num];
for(i=0;i<num;i++) scanf("%c %d %d",&Data[i].ch,&Data[i].n,&Data[i].m);
for(i=0;i<num;i++)
{
if(Data[i].n<1 || Data[i].m>10) printf("错误第%d行, n=%d,m=%d",i+1,Data[i].n,Data[i].m )
else if(Data[i].ch=='A')
{
sum=A(Data[i].n,Data[i].m);
printf("第%d行结果为:%d",i+1,sum);
}else if(Data[i].ch=='C'){
sum=C(Data[i].n,Data[i].m);
printf("第%d行结果为:%d",i+1,sum);
}else printf("错误,第%d行 case=%c",i+1,Data[i].ch);
}
return 0;
}
望采纳