找到除数并将它们存储在数组中

时间:2015-04-15 17:35:14

标签: c

我编写了以下代码,其中包含两个函数

1.找到数字的除数数

2.将除数存储在数组中。

#include <stdio.h>

int numOfDivisors(int n)
{
    int i, numOfDivisors=0;

    for(i=1;i<=n;i++)
    {
        if(n%i==0)
        {
            numOfDivisors++;
        }
    }
    return numOfDivisors;
}

void storeDivisors(int count,int divisors[],int n)
{
    int i,j;
    for(i=1,j=0;i<=n,j<count;i++,j++)
    {
        if(n%i==0)
        {
            divisors[j]=i;
        }
    }

}

int main()
{
    int n,m,a,i;

    scanf("%d %d %d",&n,&m,&a);

    int count1=numOfDivisors(n);
    int count2=numOfDivisors(m);

    /*printf("%d %d",count1,count2);*/

    int divisors1[count1],divisors2[count2];

    storeDivisors(count1,divisors1,n);
    storeDivisors(count2,divisors2,m);

    for(i=0;i<count1;i++)
    {
        printf("%d\t%d\n",divisors1[i],divisors2[i]);
    }

    return 0;
}

这只是我需要制作的更大代码的一部分。

我得到了垃圾值。我做错了什么?

4 个答案:

答案 0 :(得分:3)

  

我得到了垃圾值。我做错了什么?

如果count2小于count1,则divisors2没有那么多的值,您最终会越过边界访问数组。

分别打印两个除数。

for(i=0;i<count1;i++)
{
    printf("%d\n",divisors1[i]);
}

for(i=0;i<count2;i++)
{
    printf("%d\n",divisors2[i]);
}

另外,正如@BLUEPIXY所指出的,storeDivisiors中存在索引错误。

而不是

for(i=1,j=0;i<=n,j<count;i++,j++)
{
    if(n%i==0)
    {
        divisors[j]=i;
    }
}

使用

for(i=1,j=0;i<=n,j<count;i++)
{
    if(n%i==0)
    {
        divisors[j++]=i;
        //       ^^^^ increment j only when storing a divisor.
    }
}

答案 1 :(得分:2)

storeDivisors()功能中的循环错误。在其中,变量j似乎旨在表示应存储下一个除数的divisors数组中的索引,但在这种情况下,只有在实际存储除数时才应增加它。而是在每次迭代时递增它。最终会有一些divisors[]个包含垃圾值的位置,而不是所有的除数都会被存储。

循环应如下所示:

int i,j;
for(i=1,j=0;i<=n,j<count;i++)
{
    if(n%i==0)
    {
        divisors[j++]=i;
    }
}

答案 2 :(得分:1)

问题在于:

for(i=1,j=0;i<=n,j<count;i++,j++)
{
    if(n%i==0)
    {
        divisors[j]=i;
    }
}

j始终等于i-1。因此,数组divisor中的大多数项目永远不会被设置。

尝试:

for(i=1,j=0;i<=n,j<count;i++)
{
    if(n%i==0)
    {
        divisors[j]=i;
        j++;
    }
}

这样,j会增加,只有当找到除数时才会增加。

下一步是使用动态内存分配,以避免计算两次除数并使用“可调整大小”的数组。 stdlib的函数realloc()可能会激励你。为避免每次找到新的除数时重新分配数组,将需要类似于vector的结构。请参阅How to replicate vector in c?Converting C++ implementation of vector in C

答案 3 :(得分:0)

我在这里回答我自己的问题,我在过去的几天里变得更好,并打算改进我的上述代码。

我已经不再需要创建函数来查找n的除数的数量,因为这对于将除数存储在数组中并不重要。我改进了我的storeDivisors函数,它不仅存储了所有除数,而且如果需要也会计算除数。这是更新的代码 -

#include <stdio.h>

void storeDivisors(int n,int a[],int *x)
{
    int i;
    for(i=1;i<=n;i++)
    {
        if(n%i==0)
            a[(*x)++]=i;
    }
}

int main()
{
    int n = 100;
    int a[100];
    int x = 0;
    int i;

    storeDivisors(n,a,&x);

    for(i=0;i<x;i++)
        printf("%d\n",a[i]);
    printf("number of divisors = %d\n",x);

    return 0;
}