【问题标题】:Representing N as sum of K non-zero integers将 N 表示为 K 个非零整数的总和
【发布时间】:2020-02-04 17:46:36
【问题描述】:

我正在寻找一个程序,它的输入 n 代表一个整数,k 整数的个数 n 应该是总和。

例如n = 5, k =2 将作为输出

1 + 4, 3 + 2.

我已经搜索了互联网,但我发现的只是一个找到一些选项但不会显示哪些选项的程序。

我不在乎程序是用哪种语言编写的,只要它符合我的要求即可。

【问题讨论】:

  • 你考虑过这个Stack Overflow answer吗?
  • 你的问题是找到所有的partitions n 分成k 部分。您可以通过调用constrained_partitions(n, k, 1, n),在this answer 中找到一个Python 解决方案,该解决方案可以找到所有有序分区(即顺序重要的地方)。或者在谷歌上搜索partition n into k parts algorithm
  • @DarshanPatil 显然,复杂性至少与所需输出的大小一样多,这对于大型n 来说将是巨大的。这是问题固有的。当您要求允许 0 时,我链接到的答案仅在输出中产生 0,方法是使用等于 0 的 min_elem 调用它;如果你用 min_elem 等于 1 来调用它,那么它不会在输出中包含 0。
  • @DarshanPatil 是的,我特别说我链接到的答案是针对“有序分区(即,顺序很重要)”。请仔细阅读;这里不需要@标记我。

标签: math


【解决方案1】:

将整数分成 k 部分:p(n, k)

#include<stdio.h>
#include<math.h>
int x=1;
void array_print(int p[], int n, int u,int y,int d)
{
    int i,s=0,l=u;
    int m=d;
    int j=1;
    if(n<=l)   
    for(i=0;i<l;i++)
    {
        s += p[i];
        j=j*p[i];
    }
    if(j>0&&s==y)
    {
         printf("%d] ",x++);
         for (i=0;i<l;i++)
         printf("%d ",p[i]);
     printf("\n");
}
}
void P(int n,int l)
{
    int p[n];
    int t=n;
    int k = 0;
    int g=0;
    p[k] = n;
    int r;
    int f=1,e,x;
    while (1)
    {
        if(k+1<=l)
        {
            for(e=0;e<l;e++)
                x += p[e];
            if(x==t)
                f++;
        }
        array_print(p, k+1,l,t,f);
        r= 0;
        while (k >= 0 && p[k] == 1)
        {
            r += p[k];
            k--;
        }
        if (k < 0)  return;
        p[k]--;
        r++;
        while (r > p[k])
        {
            p[k+1] = p[k];
            r = r- p[k];
            k++;
        }
        p[k+1] = r;
        k++;
    }
}
int main()
{
    int num,l;
    printf("\nEnter a number to perform integer partition: ");
    scanf("%d", &num);
    printf("\nEnter parts of form: \n");
    scanf("%d",&l);
    P(num,l);
    printf("p(%d, %d)=%d", num, l, x-1);
    return 0;
}
  • 控制台

    Enter a number to perform integer partition: 7 
    Enter parts of form: 3
    1] 5 1 1 
    2] 4 2 1 
    3] 3 3 1 
    4] 3 2 2 
    p(7, 3)=4
    

上面的代码是为了分割整数:p(n) 但是,也可以打印:p(n,k)

但我个人建议在整数分区上使用欧拉恒等式:

p(n,k) = p(n,k-1) + p(n-k, k) 其中 p(n,k=n 或 k=1)=1

同样的三角形也可以完成。

数论中的一个美丽问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-22
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多