数学问题--大数乘以小数,大数乘以大数,大数的加法以及减法

//注:来自网上一篇word文档《清华内部acm小组预定函数》

说明:

在sub函数中,存在22222222222222 - 2222222222222 = 0000000000000的情况,

将 if(len1<0) return ;更正为

if (len1<-1 || en1==-1 && t[0]<'0' )  return;
if (len1==-1 && t[0]>='0')  goto loop; 

一,

#include <stdio.h>
#include <string.h>

void mult(char c[],char t[],int m)  //t[]=c[]*m
{
    int i,l,k,flag,add=0;
    char s[100];
    l=strlen(c);
    for (i=0;i<l;i++)
        s[l-i-1]=c[i]-'0'; 
    for (i=0;i<l;i++)
	{
		k=s[i]*m+add;
		if (k>=10) 
		{
			s[i]=k%10;
			add=k/10;
			flag=1;
		}
        else 
		{
			s[i]=k;
			flag=0;
			add=0;
		}
	}
    if (flag) 
	{
		l=i+1;
		s[i]=add;
	} 
	else l=i;
    for (i=0;i<l;i++)
        t[l-1-i]=s[i]+'0';
    t[l]='\0';
}

void main()
{
	char c[100];
	char t[100];
	int m;
	scanf("%s",c);
	scanf("%d",&m);
	mult(c,t,m);
	printf("%s\n",t);
}

语法:mult(char c[],char t[],int m);

参数:

c[]

被乘数,用字符串表示,位数不限

t[]

结果,用字符串表示

m

乘数,限定10以内

返回值:

null


 

二,
void mult(char a[],char b[],char s[])
{
    int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
	char result[65];
	alen=strlen(a);blen=strlen(b);
	for (i=0;i<alen;i++)
		for (j=0;j<blen;j++)
			res[i][j]=(a[i]-'0')*(b[j]-'0');

   for (i=alen-1;i>=0;i--)
	{
		for (j=blen-1;j>=0;j--) sum=sum+res[i+blen-j-1][j];
        result[k]=sum%10;     
		k=k+1;
		sum=sum/10;
	}
	for (i=blen-2;i>=0;i--)
	{
		for (j=0;j<=i;j++) sum=sum+res[i-j][j];
		result[k]=sum%10;
		k=k+1;
		sum=sum/10;
    }
	if (sum!=0) {result[k]=sum;k=k+1;}

	for (i=0;i<k;i++) result[i]+='0';
    for (i=k-1;i>=0;i--)
		s[i]=result[k-1-i];
	s[k]='\0';
    while(1)
    {
		if (strlen(s)!=strlen(a)&&s[0]=='0')
			strcpy(s,s+1);
		else
			break;
    }
}


语法:mult(char a[],char b[],char s[]);

参数:

a[]

被乘数,用字符串表示,位数不限

b[]

乘数,用字符串表示,位数不限

t[]

结果,用字符串表示

 

三,
void add(char a[],char b[],char back[])
{
	int i,j,k,up,x,y,z,l;
	char *c;
	if (strlen(a)>strlen(b))
		l=strlen(a)+2; else l=strlen(b)+2;
	c=(char *)malloc(l*sizeof(char));
	i=strlen(a)-1;
	j=strlen(b)-1;
	k=0;up=0;
	while(i>=0||j>=0)
	{
		if(i<0) x='0';
		else x=a[i];
		if(j<0) y='0';
		else y=b[j];
		z=x-'0'+y-'0';
		if(up) z+=1;
        if(z>9) {up=1;z%=10;} else up=0;
		c[k++]=z+'0';
		i--;j--;
	}
	if(up) 
		c[k++]='1';
	i=0;
	c[k]='\0';
	for(k-=1;k>=0;k--)
		back[i++]=c[k];
	back[i]='\0';
} 

语法:add(char a[],char b[],char s[]);

参数:

a[]

被乘数,用字符串表示,位数不限

b[]

乘数,用字符串表示,位数不限

t[]

结果,用字符串表示

返回值:

null

 

四,
void sub(char s1[],char s2[],char t[])
{
	int i,len2,len1,k;
	len2=strlen(s2);
	len1=strlen(s1);
	t[len1]='\0';len1--;
	for (i=len2-1;i>=0;i--,len1--)
	{
		if (s1[len1]-s2[i]>=0)
			t[len1]=s1[len1]-s2[i]+'0';
		else
		{
			t[len1]=10+s1[len1]-s2[i]+'0';
			s1[len1-1]=s1[len1-1]-1;
		}
	}
	if (len1<0)  return;

	k=len1;
	while(s1[k]<0)
	{
		s1[k]+=10;
		s1[k-1]-=1;
		k--;
	}
	while(len1>=0) 
	{
		t[len1]=s1[len1];
		len1--;
	}
    loop:
	if (t[0]=='0')
	{
		len1=strlen(s1);
		for (i=0;i<len1-1;i++) t[i]=t[i+1];
		t[len1-1]='\0';
		goto loop;
	}
	if (strlen(t)==0)
	{
		t[0]='0';
		t[1]='\0';
	}
} 


语法:sub(char s1[],char s2[],char t[]);

参数:

s1[]

被减数,用字符串表示,位数不限

s2[]

减数,用字符串表示,位数不限

t[]

结果,用字符串表示

返回值:

null


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值