2012-01-28 3 views
7

Мне удалось получить сумму из двух квадратов, но она все еще не работает, если, например, 10: мне нужно 9 и 1 ... Моя идея - скрыть все предыдущие квадраты и узнать сколько будет добавлено до ввода, (max = 4) ... но im застревает, когда возникают дубликаты, и когда мне нужно добавить 3 вещи ... Для 4 вещей я думаю о просто добавлении выражения else. Любые идеи/предложения о том, как я могу улучшить свой алгоритм?Сумма двух квадратов в C

+0

Может быть, попытаться найти ответ, используя 1 квадрат, а затем 2 квадрата, затем 3 квадрата и т.д. Это гарантирует, что вы всегда будете иметь наименьшее количество квадратов, используемых. Более элегантные и эффективные решения существуют, но это то, что я представляю себе с головы. – collinjsimpson

+0

Я бы особо отметил, что в другом случае, если вы только проверите случаи 2 * prevoussquare (2 * 9 в примере) и previoussqu + refrev sq (9 + 4) - вы должны проверить ВСЕ суммы всех квадратов. – bdecaf

ответ

2

Предположим, что вы не должны использовать сложный алгоритм, я предлагаю вам просмотреть все параметры и проверить, составляет ли сумма квадратов нужный вам номер. При вычислении вы также можете сохранить числа в глобальном массиве, чтобы упростить getsquare

Редактировать: так как это хорошая проблема, я написал код. (ВНИМАНИЕ: я не проверял)

int root[4]; 

int isqrt(int i) {return (int)floor(sqrt((double)i));} 

// check if n is sum of s squares. assume s<=4 
int canbesum(int s,int n) { 
    if (s==0) return n==0; 
    int i; 
    for (i=isqrt(n);i;i--) 
     if (canbesum(s-1,n-i*i)) { 
      root[s-1]=i; 
      return 1; 
     } 
    return 0; 
} 

int sumofsquares (int x) { 
    int i; 
    for (i=0;i<=4;i++) if (canbesum(i,x)) return i; 
} 
+1

+1 Динамическое программирование. – collinjsimpson

+1

Вы, как будто пытаетесь обмануть всех. Вы можете взглянуть на это: http://www.kernel.org/doc/Documentation/CodingStyle –

+0

Это 'для ... если' мне кажется ясным, но я исправлю это. (Если вы хотели что-то еще, скажите, пожалуйста) – asaelr

Смежные вопросы