我那样写其实也有点好处的,不用考虑太多,交给一个函数去完成就行了。我怕函数写得太长自己都糊涂了……
----------------解决方案--------------------------------------------------------
void chen(int a[],int b[]) {int s[MAXSIZE],tt[MAXSIZE],i,j,l1,l2,t,d; clear(s); l1=weishu(a); l2=weishu(b); for(i=0;i<l2;i++) {t=b[MAXSIZE-1]; clear(tt); for(j=0;j<l1;j++) tt[MAXSIZE-1-j]=t*a[MAXSIZE-1-j]; tjinwei(tt); jia(s,tt); d=youyi(0,s); youyi(d,b); } i=0; while(s[i]==0) i++; while(i<MAXSIZE) printf("%d",s[i++]); for(i=0;i<l2;i++) printf("%d",b[i]); printf("\n"); } 这个函数里面也用到了tjinwei(),黑体的那一部分直接相乘,没考虑进位,红字直接调整一下就行了!
----------------解决方案--------------------------------------------------------
#include<stdio.h> #include<string.h> #include<malloc.h>
void strtoi(char *q,int a[]) {int i; for(i=0;i<strlen(q);i++) a[i]=q[i]-'0'; }
int youyi(int n,int a[],int L) {int i,t; t=a[L-1]; for(i=L-1;i>0;i--) a[i]=a[i-1]; a[0]=n; return t; }
void clear(int a[],int L) {int i; for(i=0;i<L;i++) a[i]=0; }
void tjinwei(int a[],int L) {int i; for(i=L-1;i>0;i--) {a[i-1]=a[i-1]+a[i]/10; a[i]=a[i]%10; } }
void jia(int a[],int b[],int L) {int i; for(i=0;i<L;i++) a[i]=a[i]+b[i]; tjinwei(a,L); }
char * chen(char *p,char *q) {int l1,l2,*s,*p1,*q1,*t,i,j,k,L,d; char *str; l1=strlen(p); l2=strlen(q); L=l1+l2+2; s=(int *)malloc(L*sizeof(int)); q1=(int *)malloc(l2*sizeof(int)); p1=(int *)malloc(l1*sizeof(int)); strtoi(p,p1); strtoi(q,q1); clear(s,L); t=(int *)malloc(L*sizeof(int)); for(i=0;i<l2;i++) {k=q1[l2-1]; clear(t,L); for(j=0;j<l1;j++) t[L-1-j]=k*p1[l1-1-j]; tjinwei(t,L); jia(s,t,L); d=youyi(0,s,L); youyi(d,q1,l2); } str=(char *)malloc((L+l2)*sizeof(char)); i=0;j=0; while(s[i]==0) i++; while(i<L) str[j++]=s[i++]+'0'; for(i=0;i<l2;i++) str[j++]=q1[i]+'0'; str[j]='\0'; free(s); free(q1); free(p1); return str; }
void main() {char a[100],b[100]; scanf("%s%s",a,b); printf("%s\n",chen(a,b)); getch(); }
[此贴子已经被作者于2005-4-11 17:45:37编辑过]
----------------解决方案--------------------------------------------------------
你的进位函数可以进一步优化的
for(i=L-1;i>0;i--)
{a[i-1]=a[i-1]+a[i]/10;
a[i]=a[i]%10;
}
如果没进位,完全可以break;
----------------解决方案--------------------------------------------------------
既然你们这么有兴趣,为什么不写比一比谁的更好?
我提个议,完成如下函数:
1。加法 char * fun0(char *a ,char*b,char *c)//a,b为算数,c为存放结果字符串
2。减法 char * fun1(char *a ,char*b,char *c)//a,b为算数,c为存放结果字符串
3。乘法 char * fun2(char *a ,char*b,char *c)//a,b为算数,c为存放结果字符串
4。除法 char * fun3(char *a ,char*b,char *c)//a,b为算数,c为存放结果字符串
最后看看谁的算法好,效率高
----------------解决方案--------------------------------------------------------
啊,除法有难度!!!
还有一点小问题,返回值是什么啊?
----------------解决方案--------------------------------------------------------
----------------解决方案--------------------------------------------------------
这样改一下函数吧: 返回的即为结果,函数的最后一个参数不要! 还有一个条件,只能为整数(小数就算了,我写不出来……)。 1。加法 char * fun0(char *a ,char*b) //a,b为算数, 2。减法 char * fun1(char *a ,char*b) //a,b为算数, 3。乘法 char * fun2(char *a ,char*b) //a,b为算数, 4。除法 char * fun3(char *a ,char*b) //a,b为算数, 既然knocker,乌鸦丘比特 都有兴趣,那我试试看了,不知道还有没有有兴趣的…… 能写出来就行,能实现其中一个也行! 重要参与,我估计我写的东西最差了……
[此贴子已经被作者于2005-4-13 15:49:29编辑过]
----------------解决方案--------------------------------------------------------
花了几天的时间,终于写出来了……
文件下载:
[此贴子已经被作者于2005-4-15 13:11:57编辑过]
----------------解决方案--------------------------------------------------------
把整数的操作写个单独的文件,可以重用
----------------解决方案--------------------------------------------------------