| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3113 人关注过本帖
标题:求助,用递归的方法求Pell's equation p^2-2q^2=1的前50对解
只看楼主 加入收藏
楚子航992
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2020-5-4
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:11 
求助,用递归的方法求Pell's equation p^2-2q^2=1的前50对解
#include<stdio.h>
int main(){
    long long int p=1,q=1,count=0;
    while(1){
        while(p*p<(2*q*q+1)){
            p++;
        }
        if(p*p==(2*q*q+1)){
            count++;
            printf("(%d,%d) ",p,q);
        }
        q++;
        if(count==10) break;
    }
    return 0;
}
我只会这么写,但这么写根本输出不了那么多。。。而且也不是递归。。。。
搜索更多相关主题的帖子: while 递归 long count 方法 
2020-05-30 20:31
JabinZ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:34
专家分:180
注 册:2020-5-7
收藏
得分:3 
你用 count==10 限制了只处理10对数据, 当然不会出现50个

程序代码:
printf("(%d,%d) ",p,q);
// 改为
printf("(%lld,%lld) ",p,q);


[此贴子已经被作者于2020-5-30 21:10编辑过]

2020-05-30 21:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:3 
编译你的代码报错:
printf("(%d,%d) ",p,q);
warning: format '%d' expects argument of type 'int', but argument 2 has type 'long long int'

另外,你题目中说50个,怎么代码中却是 if(count==10) break ?
2020-05-30 21:07
楚子航992
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2020-5-4
收藏
得分:0 
回复 2楼 JabinZ
您好,改完之后还是出现不了50个
2020-05-30 21:13
JabinZ
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:34
专家分:180
注 册:2020-5-7
收藏
得分:0 
我现在有几个问题

1. 你的这个方程式的解,到后面数大概多大,你自己知道么?(找到第12个解,就已经9位数了,那按照你写的这个方法,要循环多少次才能找到50个答案,你需要等多久?)
2. 以你目前的方法,根本不要考虑改成递归,压栈会死掉的
2020-05-30 21:35
楚子航992
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2020-5-4
收藏
得分:0 
回复 5楼 JabinZ
所以我的目的就是来论坛问问大佬们,用什么方法做,我知道我这个算法不行的,所以来请教下
2020-05-30 21:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
路过,纯吃瓜群众,我只是想看看 long long int 能不能容得下前50个解。

程序代码:
int main( void )
{
    typedef unsigned long long TYPE;
   
    TYPE d = 2;
    TYPE x1=3, y1=2;
    TYPE xn=x1, yn=y1;
   
    for( size_t i=0; i!=50; ++i )
    {
        printf( "%zu: %llu, %llu\n", i+1, xn, yn );

        if( xn*x1/x1!=xn || d*yn*y1/y1/yn!=d || xn*x1+d*yn*y1<xn*x1 )
        {
            puts( "overflow" );
            break;
        }

        TYPE x = xn*x1 + d*yn*y1;
        TYPE y = xn*y1 + yn*x1;
        xn=x, yn=y;
    }
}
结果是只能容纳前25组解,输出结果是
1: 3, 2
……
25: 6882627592338442563, 4866752642924153522
overflow

然后我将 unsigned long long 换成 非标准的 __uint128_t,正巧能容纳下第50组,接下来就溢出了。

2020-05-30 22:05
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:3 
p只可能是奇数,所以p可以+=2
话说1    0算一对解么
2020-05-30 22:37
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:3 
以下是引用fulltimelink在2020-5-30 22:37:38的发言:

p只可能是奇数,所以p可以+=2
话说1    0算一对解么


玩数论的时候一般对0有歧视,只玩正整数,所以不算。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-05-30 22:44
fulltimelink
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:171
专家分:752
注 册:2020-4-1
收藏
得分:0 
回复 9楼 forever74
了解了
2020-05-31 07:40
快速回复:求助,用递归的方法求Pell's equation p^2-2q^2=1的前50对解
数据加载中...
 
   



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

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