Предположим, n и a не может быть отрицательным:
#include <stdio.h>
/* n == a + (a+1) + (a+2) + ... + (a + m) == a*(m+1) + m*(m+1)/2
a = (n/(m+1)) - m/2;
b = (a + m) */
int main(void)
{
int n;
if ((scanf("%d", &n) != 1)|| (n < 0))
puts("invalid value");
else {
for (int m = 0; ; ++m) {
int a = (n/(m+1)) - m/2;
if (a < 0)
break;
/* check no round problem */
if ((a*(m+1) + m*(m+1)/2) == n)
printf("a=%d b=%d (m=%d)\n", a, a+m, m);
if (a == 0)
break;
}
}
return 0;
}
Компиляция и исполнения:
pi@raspberrypi:/tmp $ gcc -pedantic -Wall -Wextra f.c
pi@raspberrypi:/tmp $ ./a.out
0
a=0 b=0 (m=0)
pi@raspberrypi:/tmp $ ./a.out
1
a=1 b=1 (m=0)
a=0 b=1 (m=1)
pi@raspberrypi:/tmp $ ./a.out
2
a=2 b=2 (m=0)
pi@raspberrypi:/tmp $ ./a.out
10
a=10 b=10 (m=0)
a=1 b=4 (m=3)
a=0 b=4 (m=4)
pi@raspberrypi:/tmp $ ./a.out
123
a=123 b=123 (m=0)
a=61 b=62 (m=1)
a=40 b=42 (m=2)
a=18 b=23 (m=5)
pi@raspberrypi:/tmp $
Версия, проверяющая все правильно, выполняя формулу, если вы ни на что не доверяете; -)
#include <stdio.h>
/* n == a + (a+1) + (a+2) + ... + (a + m) == a*(m+1) + m*(m+1)/2
a = (n/(m+1)) - m/2;
a == 0 => n == m*(m+1)/2 =>
b = (a + m) */
int f(int a, int b)
{
int r = 0;
int m = 0;
do {
r += a+m;
} while ((a + m++) != b);
return r;
}
int main(void)
{
int n;
if ((scanf("%d", &n) != 1)|| (n < 0))
puts("invalid value");
else {
for (int m = 0; ; ++m) {
int a = (n/(m+1)) - m/2;
if (a < 0)
break;
if ((a*(m+1) + m*(m+1)/2) == n)
printf("a=%d b=%d (m=%d) : %s\n", a, a+m, m, (n == f(a, a+m)) ? "ok" : "KO");
if (a == 0)
break;
}
}
return 0;
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -g -pedantic -Wall -Wextra f.c
pi@raspberrypi:/tmp $ ./a.out
0
a=0 b=0 (m=0) : ok
pi@raspberrypi:/tmp $ ./a.out
1
a=1 b=1 (m=0) : ok
a=0 b=1 (m=1) : ok
pi@raspberrypi:/tmp $ ./a.out
2
a=2 b=2 (m=0) : ok
pi@raspberrypi:/tmp $ ./a.out
10
a=10 b=10 (m=0) : ok
a=1 b=4 (m=3) : ok
a=0 b=4 (m=4) : ok
pi@raspberrypi:/tmp $ ./a.out
123
a=123 b=123 (m=0) : ok
a=61 b=62 (m=1) : ok
a=40 b=42 (m=2) : ok
a=18 b=23 (m=5) : ok
pi@raspberrypi:/tmp $