我编写了以下代码,其中包含两个函数
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;
}
这只是我需要制作的更大代码的一部分。
我得到了垃圾值。我做错了什么?
答案 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;
}