在上一次考试中,我们必须编写程序,找出给定的数字是否可以写成非等号的平方和。
最小的正方形必须是2^2,而不是1^2
例如,-给定的数字是13->真,因为13被重写为2^2+3^2
如果给定的数字是8->假,因为8是2^2+2^2,这是相等平方和。
我在寻找正确的算法上吃力了例如,我将得到65号。我想写一个帮助程序“squares”,它总是找到给定数字的sqr(从2^2开始)到给定数字的sqr或大于65的sqr。例如65,它会找到2^2 3^2 4^2 5^2 6^2 7^2 8^2,现在我不知道如何测试所有平方组合的和,如果它们给出答案65。答案应该是正确的,因为4^2和7^2将给出结果65
编辑1:
我写了这段代码它没有给出正确的结果
(平方和17)—>真
(define (sum-sq n)
(sum-sq-help n 2))
(define (sum-sq-help n i)
(if (or (= (sqr i) (/ n 2)) (= n 0))
#f
(if (integer? (sqrt (- n (sqr i)))) #t (sum-sq-help n (+ 1 i)))))
编辑2:更新-一切正常
(define (sum-sq n)
(sum-sq-help-2 n 2))
(define (sum-sq-help-2 n i)
(cond ((= (sqr i) (/ n 2)) #f)
((< n (sqr i)) #f)
((= 1 (- n (sqr i))) #f)
((integer? (sqrt (- n (sqr i)))) #t)
(else (sum-sq-help-2 n (+ 1 i)))))
最佳答案
Input: n
Output: Is n a sum of squares?
Algorithm:
1. xs := {i^2 | 1<i^2<n}
2. x := n
3. loop
if x<=1 then return false as the final result
if x in xs then return true as the final result
x := x - (largest number in xs smaller than x)
endloop