(C语言)组合数的和 --pta

 

给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。

输入格式:

输入在一行中先给出 N(1 < N < 10),随后给出 N 个不同的非 0 个位数字。数字间以空格分隔。

输出格式:

输出所有可能组合出来的2位数字的和。

输入样例:

3 2 8 5

输出样例:

330

记得点个赞! 

代码:

#include<stdio.h>
int combination(int* pa, int j)
{
    int C = 0, i,n;
    int* pm;
    int* pn;
    pn = pa;
    //pm = pa;
    for (n=0;n<j;n++)
    {
        for (i = 0,pm = pa; i <j; i++)
        {
            if(*pn!=*pm)
            {
                C += (*pn) * 10 + (*pm);
            }
            pm++;
        }
        pn++;
    }
    return C;
}
int main()
{
    int i, j;
    int arr[10];/* = { 2, 8, 5 };*/
    scanf("%d", &j);
    for (i = 0; i < j; i++)
    {
        scanf("%d", &arr[i]);
    }
    int A = combination(arr, j);
    printf("%d", A);
    return 0;
}

 

### C语言递归实现组合数计算 在C语言中,可以使用递归来解决许多数学问题,其中包括组合数的计算。组合数 \( C(n, m) \),也称为二项式系数,表示从n个不同元素中选取m个元素的方式数目。 #### 组合数公式 组合数可以用以下递推关系定义: \[ C(n, m) = C(n-1, m-1) + C(n-1, m), \text{当} 0 < m < n \] 边界条件为: \[ C(n, 0) = 1,\quad C(n, n) = 1 \] 基于上述公式,可以直接编写一个递归函数来计算组合数: ```c #include <stdio.h> // 计算组合数 C(n, m) int combination(int n, int m) { if (m == 0 || m == n) { // 边界条件 return 1; } return combination(n - 1, m - 1) + combination(n - 1, m); // 递归调用 } int main() { int n, m; printf("请输入nm的值:"); scanf("%d %d", &n, &m); if (m > n || n < 0 || m < 0) { printf("输入有误!\n"); } else { printf("C(%d, %d) = %d\n", n, m, combination(n, m)); } return 0; } ``` 此程序首先检查输入的有效性,然后调用 `combination` 函数进行递归计算并打印结果[^1]。 需要注意的是,这种纯递归方法虽然简单易懂,但在处理较大的数值时效率较低,因为它会重复计算相同的子问题多次。如果需要优化性能,可以考虑采用动态规划或者记忆化搜索技术存储已经计算过的组合数以减少冗余运算[^2]。 #### 动态规划版本(可选) 下面是一个改进后的版本,它利用二维数组保存中间结果从而避免不必要的重复计算: ```c #include <stdio.h> #define MAXN 100 int dp[MAXN][MAXN]; void init_dp(){ for(int i=0;i<MAXN;i++) { dp[i][0]=dp[i][i]=1; // 初始化边界条件 } } int get_combination(int n, int m){ if(dp[n][m]!=0)return dp[n][m]; return dp[n][m] = get_combination(n-1,m-1)+get_combination(n-1,m); } int main(){ init_dp(); int n,m; while(scanf("%d%d",&n,&m)!=EOF && !(n==0&&m==0)){ printf("%d\n",get_combination(n,m)); } return 0; } ``` 这个版本初始化了一个全局二维数组 `dp[][]` 来记录所有可能的状态值,在每次查询之前先查看是否已经有对应的解答存在,如果有则直接返回已有的答案;如果没有,则按照原逻辑继续向下递归求解,并把新得到的结果存入表中以便后续访问时能快速查找到[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个正在爬的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值