大整数相加*相乘

作者在 2011-07-07 23:00:37 发布以下内容
大整数“相乘”(总算改得漂亮点了)[br/]采用一位一个结点存储,所以长度不是很长…比起下面那个三位一个节点的加法也长度差不多…如果改成功三位的话也许更长点…经过几夜鏖战,终于成功搞定了这个号称程序设计大赛的题目。[br/]今天愚人节也很有收获,很高兴…[br/]其中问号是C++里输入的中文…[br/][br/][br/][br/]#include<stdio.h>[br/]int *add(int b[],int c[],int m,int n);[br/][br/]void main()[br/]{[br/]int b[200],c[200],m=0,n=0,i;[br/]char ch1[200],ch2[200];[br/]printf("??????????????????\nb=");[br/]gets(ch1);[br/]printf("c=");[br/]gets(ch2);[br/]for(i=0;ch1[i]!='\0';i++)[br/]b[i]=ch1[i]-'0';[br/]m=i;[br/]for(i=0;ch2[i]!='\0';i++)[br/]c[i]=ch2[i]-'0';[br/]n=i;[br/]int p,t,j,k,a[200][400];[br/]for(p=0,j=n-1;p<n&&j>=0;p++,j--)[br/]{[br/]a[p][0]=0;[br/]for(i=m,t=0,k=m-1;k>=0;k--,i--)[br/]{[br/]a[p][i]=(b[k]*c[j]+t)%10;[br/]t=(b[k]*c[j]+t)/10;[br/]}[br/]a[p][i]=t;[br/]}[br/]for(i=1;i<n;i++)[br/]for(j=m+1;j<=m+i;j++)[br/]a[i][j]=0;[br/]int s[400],d[400],l,J;[br/]int *z;[br/]for(i=0;i<n-1;i++)[br/]{[br/]for(j=0,l=0;(j<=m+i)||(l<=m+i+1);l++)[br/]{[br/]s[j]=a[i][j];[br/]d[l]=a[i+1][l];[br/]if(j<=m+i)[br/]j++;[br/]}[br/]z=add(s,d,j,l);[br/]for(j=0;j<l;j++) [br/]a[i+1][j]=*(z+j);[br/]}[br/]printf("\n????????:");[br/]for(i=0;i<m+n;i++)[br/]printf("%d",a[n-1][i]);[br/]printf("\n");[br/]}[br/][br/][br/]int *add(int b[],int c[],int m,int n)[br/]{[br/]int a[400],i,j,k,t;[br/]t=m>n?(m-1):(n-1);[br/]a[t]=0;[br/]a[0]=0;[br/]for(i=m-1,j=n-1,k=t;i>=0||j>=0;i--,j--,k--)[br/]{[br/]if(j>=0&&i>=0)[br/]{[br/]a[k-1]=(a[k]+b[i]+c[j])/10;[br/]a[k]=(a[k]+b[i]+c[j])%10;[br/]}[br/]else[br/]if(j<0&&i>=0)[br/]{[br/]a[k-1]=(a[k]+b[i])/10;[br/]a[k]=(a[k]+b[i])%10;}[br/]else[br/]if[br/](j>=0&&i<0)[br/]{[br/]a[k-1]=(a[k]+c[j])/10;[br/]a[k]=(a[k]+c[j])%10;[br/]}[br/]}[br/]for(i=0;i<=t;i++)[br/]c[i]=a[i];[br/]return(c);[br/]}[br/][br/][br/][br/]大整数相加,这个写得我吐血…相乘的更复杂,暂时写不了,作业作孽呀![br/]#include<stdio.h>[br/]void add(int b[],int c[],int m,int n)[br/]{int a[300];[br/]int i ,j ,k;[br/]a[m]=0;[br/]for(i=m-1,j=n-1,k=m;i>=0;i--,j--,k--)[br/]{if(j>=0)[br/]{a[k-1]=(a[k]+b[i]+c[j])/1000;[br/]a[k]=(a[k]+b[i]+c[j])%1000;}[br/]else [br/]{a[k-1]=(a[k]+b[i])/1000;[br/]a[k]=(a[k]+b[i])%1000;}}[br/]printf("\nThe added number is:");[br/]for(i=0;i<m+1;i++)[br/]printf("%d",a[i]);[br/]}void main()[br/]{int b[200],c[200],m=0,n=0,i,j;[br/]char ch1[200],ch2[200];printf("input two numbers\nb=");[br/]gets(ch1);printf("c=");[br/]gets(ch2);[br/]for(i=0,j=0;ch1[i]!='\0';i=i+3,j++)[br/]{b[j]=(ch1[i]-'0')*100;[br/]if(ch1[i+1]!='\0')[br/]b[j]=b[j]+(ch1[i+1]-'0')*10;[br/]else break;[br/]if(ch1[i+2]!='\0')[br/]b[j]=b[j]+ch1[i+2]-'0';[br/]else break;[br/]if(ch1[i+3]!='\0')[br/]continue;[br/]else break;}m=j+1;[br/]for(i=0,j=0;ch2[i]!='\0';i=i+3,j++)[br/]{[br/]c[j]=(ch2[i]-'0')*100;[br/]if(ch2[i+1]!='\0')[br/]c[j]=c[j]+(ch2[i+1]-'0')*10;[br/]else break;[br/]if(ch2[i+2]!='\0')[br/]c[j]=c[j]+ch2[i+2]-'0';[br/]else[br/]break;if(ch2[i+3]!='\0')[br/]continue;[br/]else break;[br/]}n=j+1;[br/]printf("\nb=");[br/]if(b[m-1]%100==0)[br/]b[m-1]=b[m-1]/100;[br/]if(b[m-1]%10==0)[br/]b[m-1]=b[m-1]/10;[br/]for(i=0;i<m;i++)[br/]printf("%d",b[i]);[br/]printf("\nc=");[br/]if(c[n-1]%100==0)[br/]c[n-1]=c[n-1]/100;[br/]if(c[n-1]%10==0)[br/]c[n-1]=c[n-1]/10;[br/]for(i=0;i<n;i++)[br/]printf("%d",c[i]);[br/]add(b,c,m,n);}[br/][br/][br/]添上之前没编好的“割圆术”求PAI的算法,祖冲之的圆周率求法…[br/]不过由于系统限制,目前简单的语句只能算到小数点后十七位,如果用大数存取计算的话,也许可以无限长,目前未能解决…[br/][br/]#include<stdio.h>[br/]#include<math.h>[br/]#define NUM 50[br/][br/]void main()[br/]{int i=1;[br/]long double a=sqrt(2);[br/]double b,c,d=1;[br/]while(i<NUM)[br/]{c=a*a/4;[br/]b=(1-sqrt(1-c))*(1-sqrt(1-c));[br/]a=sqrt(b+c);[br/]i++;}[br/]d=a;[br/]for(i=0;i<NUM;i++)[br/]d=d*2;[br/]printf("%17.16f\n",d);}
程序原创 | 阅读 650 次
文章评论,共0条
游客请输入验证码
文章归档
最新评论