关于佩尔方程的前X(多组)解,特例:p^2-2q^2=1

对于佩尔方程的简单求解(特例)

新手感悟:

在很多组解之后,佩尔方程的解组会变得非常大,则需要利用数组,将一个非常大的数变成单个的数字,并存放在数组中
基本思路
1.数组乘法:

void mutiply(int *a,int x,int *af){
    int i=N-1,j=0,k=0;
    for (i=N-1;i>=0;i--){
        j=(*(a+i))*x+k;
        *(af+i)=j%10;
        k=j/10;
    }
}

该函数是核心部分,即做乘法,采取小学计算的思路,也就是平常人计算乘法的思路,因为根据佩尔方程的通解,只需要2,3,4,这三个数字去乘特别大的数字即可

2.数组相加:

void add(int *a,int *af,int *b){
    int i=N-1,j=0,k=0;
    for (i=N-1;i>=0;i--){
        j=(*(a+i))+(*(af+i))+k;
        *(b+i)=j%10;
        k=j/10;
    }
}

将两个特别大的数相加起来的数组,因为可以利用数组,将特别大的数加起来

3.递归调用:
最后,递归的方法进行计算,即可求出50组解
甚至是更多组

总代码:

#include<stdio.h>
#define N 100

//x[n]=3*x[n-1]+4*y[n-1];
//y[n]=2*x[n-1]+3*y[n-1];

void mutiply(int *a,int x,int *af){
    int i=N-1,j=0,k=0;
    for (i=N-1;i>=0;i--){
        j=(*(a+i))*x+k;
        *(af+i)=j%10;
        k=j/10;
    }
}

void add(int *a,int *af,int *b){
    int i=N-1,j=0,k=0;
    for (i=N-1;i>=0;i--){
        j=(*(a+i))+(*(af+i))+k;
        *(b+i)=j%10;
        k=j/10;
    }
}
void copy(int *x,int *y){
    int i=0,j;
    for (i=0;i<N;i++){
        if((*(x+i))!=0){
            j=i;
            break;
        }
    }
    for(j=i;j<N;j++){
        *(y+j)=*(x+j);
    }
}
void pell(int i,int *a,int *a1,int *b,int *b1,int *af,int *bf){
    int j=0,k=0;
    if(i==1){printf("end");}
    else{
        mutiply(a,3,a1);
        mutiply(b,4,b1);
        add(a1,b1,af);
        mutiply(a,2,a1);
        mutiply(b,3,b1);
        add(a1,b1,bf);
        copy(af,a);
        copy(bf,b);
        for(j=0;j<N;j++){
            if(*(af+j)!=0){
                k=j;
                break;
            }
        }
        printf("(");
        for(k=j;k<N;k++){
            printf("%d",*(af+k));
        }
        printf(",");
        for(j=0;j<N;j++){
            if(*(bf+j)!=0){
                k=j;
                break;
            }
        }
        for(k=j;k<N;k++){
            printf("%d",*(bf+k));
        }
        printf(")");
        printf("\n");
        pell(i-1,a,a1,b,b1,af,bf);
    }
}
int main() {
    int a[N]={0},b[N]={0},a1[N]={0},b1[N]={0},af[N]={0},bf[N]={0};
    int *ap=a,*bp=b,*a1p=a1,*b1p=b1,*afp=af,*bfp=bf;
    *(ap+(N-1))=3;
    *(bp+(N-1))=2;
    printf("(3,2)\n");
    pell(50,ap,a1p,bp,b1p,afp,bfp);
    
    return 0;
}

最终结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值