Largest int from concatenated ints: Difference between revisions

→‎{{header|C}}: replaced with simpler code with total length limitation
(Promoted to task from draft.)
(→‎{{header|C}}: replaced with simpler code with total length limitation)
Line 19:
<lang C>#include <stdio.h>
#include <stdlib.h>
#include <stdargstring.h>
 
int icsortcatcmp(const void *pxa, const void *pyb)
int diglen(int n)
{
char ab[32], ba[32];
int len = 1;
sprintf(ab, "%d%d", *(int*)a, *(int*)b);
while (n /= 10) ++len;
sprintf(ba, "%d%d", *(int*)b, *(int*)a);
return len;
return strcmp(ba, ab);
}
 
longvoid maxcat(int sz*a, ...int len)
int icsort(const void *px, const void *py)
{
int i;
int x = *(int *) px, y = *(int *) py;
qsort(nsa, szlen, sizeof(int), icsortcatcmp);
int lx = diglen(x), ly = diglen(y);
for (i = 0; i < szlen; i++i)
int mx = 10, my = 10; /* magnitudes */
printf("%d", a[i]);
 
putchar('\n');
while (--lx) mx *= 10;
while (--ly) my *= 10;
return (y * mx + x) - (x * my + y);
}
 
int main(void)
long maxcat(int sz, ...)
{
int x[] = {1, int34, i3, len98, = 076, off =45, 04};
int y[] = {54, 546, 548, 60};
int n, *ns = malloc(sz * sizeof(int));
char *buf;
long max;
 
maxcat(x, sizeof(x)/sizeof(x[0]));
va_list va;
maxcat(y, sizeof(y)/sizeof(y[0]));
va_start(va, sz);
for (i = 0; i < sz; ++i) {
n = va_arg(va, int);
ns[i] = n;
len += diglen(n);
}
va_end(va);
 
return len0;
buf = malloc(++len);
qsort(ns, sz, sizeof(int), icsort);
 
for (i = 0; i < sz; ++i)
off += sprintf(buf + off, "%d", ns[i]);
max = atol(buf);
 
free(ns);
free(buf);
return max;
}
 
int main(void)
{
printf("%ld\n", maxcat(8, 1, 34, 3, 98, 9, 76, 45, 4));
printf("%ld\n", maxcat(4, 54, 546, 548, 60));
return 0;
}</lang>
 
{{out}}
 
<pre>998764543431
6054854654</pre>
Anonymous user