//注:来自网上一篇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 |