| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4490 人关注过本帖
标题:[原创]大整数乘法
只看楼主 加入收藏
空前
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
等 级:新手上路
威 望:2
帖 子:625
专家分:0
注 册:2004-7-19
收藏
得分:0 
你的进位函数可以进一步优化的
for(i=L-1;i&gt;0;i--)
{a[i-1]=a[i-1]+a[i]/10;
a[i]=a[i]%10;
}
如果没进位,完全可以break;

我喜欢创造,一只扑腾着翅膀向天空飞翔的乌鸦
2005-04-12 16:50
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
既然你们这么有兴趣,为什么不写比一比谁的更好?

我提个议,完成如下函数:

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为存放结果字符串


最后看看谁的算法好,效率高

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-04-12 21:24
空前
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
空前
Rank: 1
等 级:新手上路
帖 子:1146
专家分:0
注 册:2004-5-11
收藏
得分:0 
花了几天的时间,终于写出来了……

文件下载:
bNOUJUhN.rar (9.06 KB)


[此贴子已经被作者于2005-4-15 13:11:57编辑过]



2005-04-15 10:04
lebk
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2005-4-13
收藏
得分:0 
把整数的操作写个单独的文件,可以重用
2005-04-15 10:47
快速回复:[原创]大整数乘法
数据加载中...
 
   



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

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