免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: liuke432
打印 上一主题 下一主题

[C] 一道算法题,求最优解法? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-04-17 16:36 |只看该作者
原帖由 ypxing 于 2008-4-17 16:23 发表
大家应该探讨有没有低于O(n)的算法

这就是我前面提到的,去找勾股数的公式和定理。

论坛徽章:
0
22 [报告]
发表于 2008-04-17 16:57 |只看该作者

回复 #21 cugb_cat 的帖子

其实很想证明:
(a1, b1, c1)
(a2, b2, c2)
(a3, b3, c3)

c3/c2 > c2/c1 > 5

没证出来

论坛徽章:
29
戌狗
日期:2013-11-14 09:53:052016科比退役纪念章
日期:2016-07-12 18:29:4415-16赛季CBA联赛之新疆
日期:2016-11-07 13:15:0015-16赛季CBA联赛之辽宁
日期:2017-01-18 10:23:5115-16赛季CBA联赛之吉林
日期:2017-05-02 14:02:2319周年集字徽章-年
日期:2020-01-15 13:50:582016科比退役纪念章
日期:2021-06-03 14:15:3115-16赛季CBA联赛之山东
日期:2021-06-21 17:30:5615-16赛季CBA联赛之江苏
日期:2021-06-22 16:42:2015-16赛季CBA联赛之深圳
日期:2021-12-21 15:54:0215-16赛季CBA联赛之佛山
日期:2022-04-08 09:43:5715-16赛季CBA联赛之广东
日期:2022-06-29 19:59:19
23 [报告]
发表于 2008-04-17 17:04 |只看该作者

回复 #22 ypxing 的帖子

命题成立的话也应该是O(N)的算法.

论坛徽章:
0
24 [报告]
发表于 2008-04-17 17:09 |只看该作者

回复 #23 wxycyel 的帖子

命题成立的话,最坏情况是O(n),
但是,会快很多

比如,最好情况下,第一次检查1,第二次检查5,...25, ....125

论坛徽章:
0
25 [报告]
发表于 2008-04-22 13:45 |只看该作者

回复 #24 ypxing 的帖子

#include <iostream.h>
#include <math.h>

int main(int argc, char* argv[])
{
const int n = 200;
float r = 0;

for ( int i = 3; i < n; i += 2) {
&nbsp;&nbsp;&nbsp;r = sqrt(2 * i * i - 1);
&nbsp;&nbsp;&nbsp;if ( r == int(r) )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << -(1 - r ) / 2 << " " << -(1 - r) / 2 + 1 << " " << i << endl;
}

&nbsp;&nbsp;&nbsp;getchar();
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
26 [报告]
发表于 2008-04-22 19:37 |只看该作者
import java.io.*;
import java.sql.*;
import java.math.BigDecimal;

/**
* oracle数据库thin协议下操作测试.
*/
public class jie
{
    public static void main(String[] args)
    {
   int i,j,k;
   int N=2000;
   int c;
   long t=System.currentTimeMillis();c=0;
   for(i=2;i<N;i++)
       for(j=2;j<N;j++)
           for(k=2;k<N;k++){c++;
             if((i*i+j*j==k*k)&&(j==i+1))
                 System.out.println(i+" "+j+" "+k+"次数"+c);}
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");

   t=System.currentTimeMillis();c=0;
   for(i=2;i<N;i++)
       for(k=i+1;k<N;k++){c++;
             if(i*i+(i+1)*(i+1)==k*k)
                 System.out.println(i+" "+(i+1)+" "+k+"次数"+c);}
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");

   t=System.currentTimeMillis();c=0;
   for(i=2;i<N;i++)
       for(k=(int)(i*1.4);k<N;k++){c++;
             if(i*i+(i+1)*(i+1)==k*k)
                 System.out.println(i+" "+(i+1)+" "+k+"次数"+c);}
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");

    }
}

N=1000

C:\__>java -cp . jie
3 4 5
20 21 29
119 120 169
696 697 985
用时6529毫秒
3 4 5
20 21 29
119 120 169
696 697 985
用时10毫秒

N=3000

C:\__>java -cp . jie
3 4 5
20 21 29
119 120 169
696 697 985
用时176764毫秒
3 4 5
20 21 29
119 120 169
696 697 985
用时40毫秒


N=2000

C:\__>java -cp . jie
3 4 5次数3996004
20 21 29次数71894062
119 120 169次数467300400
696 697 985次数-1523126926
用时60066毫秒
3 4 5次数1999
20 21 29次数35802
119 120 169次数226913
696 697 985次数1145736
用时10毫秒
3 4 5次数2000
20 21 29次数35745
119 120 169次数224226
696 697 985次数1049714
用时30毫秒

论坛徽章:
0
27 [报告]
发表于 2008-04-22 21:27 |只看该作者

楼上的算法不知道有什么问题,比正确算法多出

import java.io.*;
import java.sql.*;
import java.math.BigDecimal;
import java.lang.Math;

/**
* oracle数据库thin协议下操作测试.
*/
public class jie
{
    public static void main(String[] args)
    {
   int i,j,k;
   int N=15000;
   int c;
   long t=System.currentTimeMillis();c=0;
/*   for(i=2;i<N;i++)
       for(j=2;j<N;j++)
           for(k=2;k<N;k++){c++;
             if((i*i+j*j==k*k)&&(j==i+1))
                 System.out.println(i+" "+j+" "+k+"次数"+c);}
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");
*/
   t=System.currentTimeMillis();c=0;
   for(i=2;i<N;i++)
       for(k=i+1;k<N;k++){c++;
             if(i*i+(i+1)*(i+1)==k*k)
                 System.out.println(i+" "+(i+1)+" "+k+"次数"+c);}
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");

   t=System.currentTimeMillis();c=0;
   for(i=2;i<N;i++)
       for(k=(int)(i*1.4);k<N;k++){c++;
             if(i*i+(i+1)*(i+1)==k*k)
                 System.out.println(i+" "+(i+1)+" "+k+"次数"+c);}
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");

   double r;
   for(i=3;i<N;i+=2){
   r=Math.sqrt(2*i*i-1);
   if(r-(int)r<0.0005)
   System.out.println((int)((r-1)/2)+" "+(int)((r-1)/2+1)+" "+i);
   }
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");




    }
}

C:\__>java -cp . jie
3 4 5次数14999
20 21 29次数269802
119 120 169次数1747913
696 697 985次数10167736
4059 4060 5741次数52616915
用时891毫秒
3 4 5次数15000
20 21 29次数269745
119 120 169次数1745226
696 697 985次数10071714
4059 4060 5741次数49326832
用时621毫秒
3 4 5
20 21 29
119 120 169
696 697 985
2377 2378 3363 *
4059 4060 5741
8815 8816 12467 *
10496 10497 14845 *
用时631毫秒

论坛徽章:
0
28 [报告]
发表于 2008-04-22 22:01 |只看该作者

应该是浮点数精度的问题

import java.io.*;
import java.sql.*;
import java.math.BigDecimal;
import java.lang.Math;

/**
* oracle数据库thin协议下操作测试.
*/
public class jie
{
    public static void main(String[] args)
    {
   int i,j,k;
   int N=150000;
   int c;
   long t=System.currentTimeMillis();c=0;
/*   for(i=2;i<N;i++)
       for(j=2;j<N;j++)
           for(k=2;k<N;k++){c++;
             if((i*i+j*j==k*k)&&(j==i+1))
                 System.out.println(i+" "+j+" "+k+"次数"+c);}
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");
*/
   t=System.currentTimeMillis();c=0;
   for(i=2;i<N;i++)
       for(k=i+1;k<N;k++){c++;
             if(i*i+(i+1)*(i+1)==k*k)
                 System.out.println(i+" "+(i+1)+" "+k+"次数"+c);}
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");

   t=System.currentTimeMillis();c=0;
   for(i=2;i<N;i++)
       for(k=(int)(i*1.4);k<N;k++){c++;
             if(i*i+(i+1)*(i+1)==k*k)
                 System.out.println(i+" "+(i+1)+" "+k+"次数"+c);}
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");
   
   t=System.currentTimeMillis();c=0;
   double r;
   for(i=3;i<N;i+=2){
       r=Math.sqrt(2*i*i-1);
       if(r-(int)r<0.000001)
          System.out.println((int)((r-1)/2)+" "+(int)((r-1)/2+1)+" "+i);
   }
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");

   t=System.currentTimeMillis();c=0;
   for(i=3;i<N;i++){
       r=Math.sqrt(i*i+(i+1)*(i+1));
       if(r-(int)r<0.000001)
          System.out.println(i+" "+(i+1)+" "+(int)r);
   }
   i=(int)(System.currentTimeMillis()-t);
   System.out.println("用时"+i+"毫秒");



    }
}

C:\__>java -cp . jie
3 4 5次数14999
20 21 29次数269802
119 120 169次数1747913
696 697 985次数10167736
4059 4060 5741次数52616915
用时891毫秒
3 4 5次数15000
20 21 29次数269745
119 120 169次数1745226
696 697 985次数10071714
4059 4060 5741次数49326832
用时611毫秒
3 4 5
20 21 29
119 120 169
696 697 985
4059 4060 5741
用时0毫秒
3 4 5
20 21 29
119 120 169
696 697 985
4059 4060 5741
用时0毫秒
但是当N更大,又出问题了
C:\__>java -cp . jie
3 4 5次数149999
20 21 29次数2699802
119 120 169次数17542913
696 697 985次数103857736
4059 4060 5741次数600311915
23660 23661 33461次数-1026167122
65536 65537 65537次数-907351004
67648 67649 69697次数-731192316
73676 73677 81003次数-252940588
89731 89732 108667次数843563301
105428 105429 133923次数1666409600
109716 109717 140643次数1848341152
131072 131073 131073次数-1814402012
用时92433毫秒
3 4 5次数150000
20 21 29次数2699745
119 120 169次数17540226
696 697 985次数103761714
4059 4060 5741次数597021832
23660 23661 33461次数-1138096685
用时61639毫秒
3 4 5
20 21 29
119 120 169
696 697 985
4059 4060 5741
6267 6268 47181
17603 17604 84037
用时20毫秒
3 4 5
20 21 29
119 120 169
696 697 985
4059 4060 5741
23660 23661 33461
46564 46565 6445
46811 46812 9363
47863 47864 16937
48439 48440 19945
51860 51861 32925
83367 83368 31865
93243 93244 14451
96532 96533 38173
114500 114501 21235
139343 139344 13361
用时40毫秒

论坛徽章:
0
29 [报告]
发表于 2008-04-23 08:45 |只看该作者
原帖由 liuke432 于 2008-4-17 13:35 发表
有一种数组(a,b,c),满足条件: a*a+b*b=c*c和b=a+1。例如(3,4,5)。
用程序找出指定范围(1

如果还要求出a^2+b^2=(b+1)^2
比如:5*5+12*12=13*13,怎么解

论坛徽章:
0
30 [报告]
发表于 2008-04-23 08:57 |只看该作者

回复 #29 hot_ice 的帖子

讨论具有这种性质的勾股数的帖子有不少,可以搜索一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP