| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4490 人关注过本帖
标题:[原创]大整数乘法
取消只看楼主 加入收藏
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
 问题点数:0 回复次数:12 
[原创]大整数乘法
看看,自己写的!
xX1R1XTG.rar (6.4 KB) [原创]大整数乘法

搜索更多相关主题的帖子: 乘法 整数 
2005-04-10 17:48
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
代码共享:

#include<stdio.h>
#define MAXSIZE 255

void init(int *p);           /*初始化数组,全部为-1*/
int input(int *p);             /*输入函数,返回1为负,0为正*/
int youyi(int n,int *p);       /*数组右移一位,高位补n,返回被移掉的一位*/
void tiaozhen(int *p);        /*将数组调整为最后一位为非-1,即为正常数*/
void jia(int *P,int *q);        /*将两个数组按位加,结果保留在a中*/
int weishu(int *P);          /*计算数组中的有效位个数*/
void tjinwei(int *P);           /*将数组各位调整为不大于10的整数*/
void chen(int *p,int *q);           /*计算两个数组的乘积,并输出结果*/
int error(int *P);                 /*判断数组各位是否为0-9之间的数,正确为0,错误为1*/
void clear(int *p);           /*将数清零*/

int main()
{int a[MAXSIZE],b[MAXSIZE],f1,f2,i;
init(a);init(b);
printf("Input the first number:");
f1=input(a);
printf("Input the second number:");
f2=input(b);
printf("\n\n\tOK!\n\n");
tiaozhen(a);tiaozhen(b);
if(error(a)||error(b)) {printf("Input error!\n");exit(0);}
i=0;
while(a[i]==0) i++;
while(i<MAXSIZE) printf("%d",a[i++]);
putchar('*');
i=0;
while(b[i]==0) i++;
while(i<MAXSIZE) printf("%d",b[i++]);
printf("= ");
if(f1!=f2) putchar('-');
chen(a,b);
printf("\n\n\tEnd!\n");
getch();
return 1;
}

void init(int a[])
{int i;
for(i=0;i<MAXSIZE;i++)
a[i]=-1;
}

int input(int a[])
{char c;
int i,f=0;
i=0; c=getch();
if(c=='-') {f=1;putchar('-'); c=getch();}
while((c>='0'&&c<='9')&&c!='\n')
{a[i++]=c-'0';
putchar(c);
c=getch();
}
printf("\n");
return f;
}

int youyi(int n,int a[])
{int i,t;
t=a[MAXSIZE-1];
for(i=MAXSIZE-1;i>0;i--)
a[i]=a[i-1];
a[0]=n;
return t;
}

void tiaozhen(int a[])
{while(a[MAXSIZE-1]==-1)
youyi(0,a);
}

int error(int a[])
{int i,s=0;
for(i=0;i<MAXSIZE;i++)
if(a[i]>10||a[i]<0) break;
if(i<MAXSIZE) s=1;
return s;
}

void jia(int a[],int b[])
{int i;
for(i=0;i<MAXSIZE;i++)
a[i]=a[i]+b[i];
tjinwei(a);
}

int weishu(int a[])
{int i,cnt=0;
for(i=0;!a[i];i++)
cnt++;
cnt=MAXSIZE-cnt;
return cnt;
}

void tjinwei(int a[])
{int i;
for(i=MAXSIZE-1;i>0;i--)
{a[i-1]=a[i-1]+a[i]/10;
a[i]=a[i]%10;
}
}

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");
}

void clear(int a[])
{int i;
for(i=0;i<MAXSIZE;i++)
a[i]=0;
}


写得不好的地方望指出!

[此贴子已经被作者于2005-4-10 18:07:28编辑过]



2005-04-10 18:06
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
以下是引用静夜思在2005-4-10 18:24:14的发言: 可以收藏自己觉得有价值的帖子
啊,怎么收藏啊?教教我!

2005-04-10 19:55
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
还是不明白!

2005-04-11 14:17
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
嗯,建议不错。

我那样写其实也有点好处的,不用考虑太多,交给一个函数去完成就行了。我怕函数写得太长自己都糊涂了……

2005-04-11 17:23
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
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(),黑体的那一部分直接相乘,没考虑进位,红字直接调整一下就行了!

2005-04-11 17:30
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 

#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编辑过]


2005-04-11 17:31
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
啊,除法有难度!!!

还有一点小问题,返回值是什么啊?

2005-04-13 15:32
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
以下是引用乌鸦丘比特在2005-4-12 16:50:53的发言: 你的进位函数可以进一步优化的 for(i=L-1;i>0;i--) {a[i-1]=a[i-1]+a[i]/10; a[i]=a[i]%10; } 如果没进位,完全可以break;
不行,要检查完的,每一位都是直接相乘的结果,低位没有进位就不代表高位没进位…… 我自己写的就是这种鸟算法……

2005-04-13 15:35
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
这样改一下函数吧: 返回的即为结果,函数的最后一个参数不要! 还有一个条件,只能为整数(小数就算了,我写不出来……)。 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-04-13 15:45
快速回复:[原创]大整数乘法
数据加载中...
 
   



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

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