对于佩尔方程的简单求解(特例)
新手感悟:
在很多组解之后,佩尔方程的解组会变得非常大,则需要利用数组,将一个非常大的数变成单个的数字,并存放在数组中
基本思路:
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;
}
最终结果: