Factors of an integer: Difference between revisions

Content added Content deleted
(Undo revision 101016 by 81.255.154.129 (previous version worked fine; no need to make it more complex))
Line 272: Line 272:


=={{header|C}}==
=={{header|C}}==
<lang c>#include <stdlib.h>
<lang c>#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>


typedef struct
typedef struct {
int *list;
{
short count;
int *list;
short count;
} Factors;
} Factors;


void xferFactors(Factors *fctrs, int *flist, int flix)
void xferFactors( Factors *fctrs, int *flist, int flix )
{
{
int ix, ij;
int ix, ij;
int newSize = fctrs->count + flix;
int newSize = fctrs->count + flix;
if (newSize > flix) {
fctrs->list = (newSize > flix) ? realloc(fctrs->list, newSize * sizeof(int)) : malloc(newSize * sizeof(int));
for (ij = 0, ix = fctrs->count; ix < newSize; ij++, ix++)
fctrs->list = realloc( fctrs->list, newSize * sizeof(int));
}
fctrs->list[ix] = flist[ij];
else {
fctrs->count = newSize;
fctrs->list = malloc( newSize * sizeof(int));
}
for (ij=0,ix=fctrs->count; ix<newSize; ij++,ix++) {
fctrs->list[ix] = flist[ij];
}
fctrs->count = newSize;
}
}


Factors *factor(int num, Factors *fctrs)
Factors *factor( int num, Factors *fctrs)
{
{
int flist[301], flix;
int flist[301], flix;
int dvsr;
int dvsr;
flix = 0;
flix = 0;
fctrs->count = 0;
fctrs->count = 0;
if (fctrs->list)
if (fctrs->list) free(fctrs->list);
free(fctrs->list);
fctrs->list = NULL;
for (dvsr=1; dvsr*dvsr < num; dvsr++) {
fctrs->list = NULL;
for (dvsr = 1; dvsr * dvsr < num; dvsr++)
if (num % dvsr != 0) continue;
if ( flix == 300) {
{
xferFactors( fctrs, flist, flix );
if (num % dvsr != 0)
flix = 0;
continue;
if (flix == 300)
}
flist[flix++] = dvsr;
{
flist[flix++] = num/dvsr;
xferFactors(fctrs, flist, flix);
flix = 0;
}
if (dvsr*dvsr == num)
}
flist[flix++] = dvsr;
flist[flix++] = dvsr;
flist[flix++] = num/dvsr;
if (flix > 0)
xferFactors( fctrs, flist, flix );
}

if (dvsr*dvsr == num)
return fctrs;
flist[flix++] = dvsr;
if (flix > 0)
xferFactors(fctrs, flist, flix);
return fctrs;
}
}
int main(int argc, char *argv[])
int main(int argc, char*argv[])
{
{
int nums2factor[] = { 2059, 223092870, 3135, 45 };
int nums2factor[] = { 2059, 223092870, 3135, 45 };
Factors ftors = { NULL, 0};
Factors ftors = { NULL, 0};
char sep;
char sep;
int i, j;
int i,j;


for (i = 0; i < 4; i++)
for (i=0; i<4; i++) {
factor( nums2factor[i], &ftors );
{
factor(nums2factor[i], &ftors);
printf("\nfactors of %d are:\n ", nums2factor[i]);
sep = ' ';
(void) printf("\nfactors of %d are:\n ", nums2factor[i]);
for (j=0; j<ftors.count; j++) {
sep = ' ';
for (j = 0; j < ftors.count; j++)
printf("%c %d", sep, ftors.list[j]);
sep = ',';
{
}
(void) printf("%c %d", sep, ftors.list[j]);
sep = ',';
printf("\n");
}
}
return 0;
(void) printf("\n");
}
return EXIT_SUCCESS;
}</lang>
}</lang>