标题:求助:VFP6.0编程问题
只看楼主
FangASU
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2016-5-15
得分:0 
回复 3楼 星光悠蓝
我明白了,我写的那个嵌套没弄对,我试了一下,这个是对的,万分感谢!!
2016-05-22 13:47
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:2 
int(sqrt(i+100))=sqrt(i+100) 和 int(sqrt(i+100))-sqrt(i+100)=0 是等价关系,可以这么做:

Clear

*!*    求一个整数 它加上100是一个完全平方数 再加上268也是完全平方数

For lnX = 0 To 10000  && 或者更大
    If Sqrt(lnX + 100) = Int(Sqrt(lnX + 100)) And Sqrt(lnX + 268) = Int(Sqrt(lnX + 268))
        ? lnX
    Endif
Endfor

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-05-22 13:48
FangASU
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2016-5-15
得分:0 
回复 10楼 aaaaaa
不是很懂...不过还是感谢大神~~
2016-05-22 13:49
FangASU
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2016-5-15
得分:0 
回复 12楼 aaaaaa
如果我把sqrt()分别赋值给两个不同变量 是应该在for循环里面赋值 还是在外面啊
应该是里面吧?之前试过在外面赋值结果没反应
2016-05-22 13:52
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:0 
应该在 For 里面:

For lnX = 0 To 10000  && 或者更大
    lnS1 = Sqrt(lnX + 100)
    lnS2 = Sqrt(lnX + 268)
    If lnS1 = Int(lnS1) And lnS2 = Int(lnS2)
         ? lnX
     Endif
 Endfor

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-05-22 14:33
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
以下是引用aaaaaa在2016-5-22 14:33:34的发言:

应该在 For 里面:

For lnX = 0 To 10000  && 或者更大
    lnS1 = Sqrt(lnX + 100)
    lnS2 = Sqrt(lnX + 268)
    If lnS1 = Int(lnS1) And lnS2 = Int(lnS2)
         ? lnX
     Endif
 Endfor

最后的结果,简洁。。
这些都是暴力遍历,不知道有无算法的,我记得以前在读书的时候,TC算法,好像什么二分法,三分法。。不知道,这个也能不能用什么算法提高效率的。

[此贴子已经被作者于2016-5-23 08:43编辑过]

2016-05-23 08:39
星光悠蓝
Rank: 9Rank: 9Rank: 9
来 自:山水甲天下
等 级:贵宾
威 望:48
帖 子:459
专家分:1116
注 册:2010-1-11
得分:0 
都是靠猜测来设定条件,不是科学的方法。
2016-05-23 10:22
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:0 
Clear

For I = 1 To 168 - 1 Step 2
    lnSum = 0
    lnCnt = 0
    lnSub = I
    Do While lnSum < 168
        lnSum = lnSum + lnSub
        lnSub = lnSub + 2
        lnCnt = lnCnt + 1
    Enddo
    If lnSum = 168 And lnCnt % 2 = 0
        ? (I - 1) * (I - 1) / 4 - 100
    Endif
Endfor

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-05-23 12:55
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:0 
解法一:枚举/遍历/海选/暴力法

解法二:公因子分解法

解法三:解方程法
*!*    公式:
*!*    a*a = OUT + 100  (1)
*!*    b*b = OUT + 268  (2)
*!*    化简 (2) - (1):
*!*    b*b - a*a = 168
*!*    解方程组:
*!*    (b-a)*(b+a) = 168

For a = 1 To 168
    For b = a To 168
        If b * b - a * a = 168
            ? "OUT = " + Transform(a * a - 100)
        Endif
    Endfor
Endfor

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-05-23 20:41
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用aaaaaa在2016-5-23 20:41:54的发言:
解法三:解方程法
*!*    公式:
*!*    a*a = OUT + 100  (1)
*!*    b*b = OUT + 268  (2)
*!*    化简 (2) - (1):
*!*    b*b - a*a = 168
*!*    解方程组:
*!*    (b-a)*(b+a) = 168

For a = 1 To 168
    For b = a To 168
        If b * b - a * a = 168
            ? "OUT = " + Transform(a * a - 100)
        Endif
    Endfor
Endfor

还可以减少一层循环
*!*    公式:
*!*    a*a = OUT + 100  (1)
*!*    b*b = OUT + 268  (2)
*!*    化简 (2) - (1):
*!*    b*b - a*a = 168
*!*    解方程组:
*!*    (b-a)*(b+a) = 168
*!*    设 (b-a) = k
*!*    则 b = 84/k + k/2
*!*    k是偶数,并且 2<=k<=84

FOR k=84 TO 2 STEP -2
    IF 84%k == 0
        b = 84/k + k/2
        IF (b-k) > 0    && a>0
            ? "OUT = " + TRANSFORM(b^2 - 268)
        ENDIF
    ENDIF
ENDFOR
2016-05-23 22:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-465118-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.126592 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved