В общем-то решается не только цепными дробями.
Я тут тоже посидел, по случаю, накрапал вот:
CODE
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
static unsigned int fast_sqrt(unsigned int arg)
{
unsigned int one,res = 0;
for(one = 1UL << (sizeof(one)*8 - 2); one > arg; one >>=2);
while(one)
{
unsigned int k= res+one;
if(arg >= k)
{
arg -= k;
res += 2*one;
}
res >>= 1;
one >>= 2;
}
return res;
}
unsigned int factorize(unsigned int arg, unsigned int initial)
{
unsigned int j, limit = fast_sqrt(arg);
if(initial == 1) initial += 1;
for(j=initial; (j<=limit)&&(arg%j);++j);
return (j<=limit)?j:0;
}
void get_mpys(uint16_t *a, uint16_t *b, unsigned int num)
{
unsigned int koeff=1;
*a = *b = 1;
while(koeff)
{
unsigned int k = factorize(num,koeff);
if(k)
{
koeff = k;
num /= k;
}
else
{
k = num;
koeff = 0;
}
if(*a * k < 65536)
*a *= k;
else
{
if(*b * k < 65536)
*b *= k;
else
{
*a=*b=0;
return;
}
}
}
}
/*test*/
int main()
{
uint16_t xa,xb;
unsigned int nnn= 7200000/7;
get_mpys(&xa,&xb, nnn);
printf("numb %d a= %d b= %d a*b = %d\n",nnn,xa,xb,xa*xb);
return 0;
}
Вкратце. Имеем static unsigned int fast_sqrt(unsigned int arg) - быстрый целочисленный квадратный корень . Он нам нужен для оценки верхнего предела
факторизации, то бишь разложения на множители.
Далее, сам факторизатор - unsigned int factorize(unsigned int arg, unsigned int initial)
Работает тупым перебором, находит множитель начиная с числа initial для параметра arg
Наконец, void get_mpys(uint16_t *a, uint16_t *b, unsigned int num) - тут уже идет последовательное нахождение коэффициентов и домножение их к a или b
То есть a*b=num
Если число не помещается в 16 разрядов - пардон, пользуемся ARR 32 бита.

Можно сравнить погрешности если кто цепные дроби подымет здесь для тестинга.