?? 高精度相乘(整數和浮點數)_200612119111.txt
字號:
#include<stdio.h>
#include<string.h>
#define N 1000
/*2.3*1.1=2.53 ;22*11=242*/
void multy(char *a,char *b)/*可用于高精度整數和高精度浮點數相乘,結果放在a中*/
{
int i,j,da,db,la,lb,lta,ltb;
da=db=0;
la=strlen(a);
lb=strlen(b);
if(la>lb)
{
char tcc[N];
strcpy(tcc,a);
strcpy(a,b);
strcpy(b,tcc);
int xxy=la;
la=lb;
lb=xxy;
}
for(i=la-1;i>=0;i--)
if(a[i]=='.')
{
da=la-1-i;
for(j=i;j<la-1;j++)
a[j]=a[j+1];
la--;
break;
}
for(i=lb-1;i>=0;i--)
if(b[i]=='.')
{
db=lb-1-i;
for(j=i;j<lb-1;j++)
b[j]=b[j+1];
lb--;
break;
}
lta=ltb=0;
int c,tc;//jin wei
char ta[N],tb[N];
int itb=0,ita=0;
for(i=la-1;i>=0;i--)
{
itb=0;
tc=c=0;
for(j=lb-1;j>=0;j--)
{
tc=c;
c=(c+(a[i]-'0')*(b[j]-'0'))/10;
tb[itb++]=(tc+(a[i]-'0')*(b[j]-'0'))%10+'0';
}
if(c>0)tb[itb++]=c+'0';
if(i!=la-1)
{
if(ita-(la-i-1)>itb)
{
for(j=itb;j<ita-(la-i-1);j++)
tb[j]='0';
itb=ita-(la-i-1);
}
else
{
for(j=ita;j<itb+(la-i-1);j++)
ta[j]='0';
ita=itb+(la-i-1);
}
c=0;
for(j=0;j<itb;j++)
{
tc=c;
c=(tc+tb[j]-'0'+ta[j+la-i-1]-'0')/10;
ta[j+la-i-1]=(tc+tb[j]-'0'+ta[j+la-i-1]-'0')%10+'0';
}
if(c>0)ta[ita++]=c%10+'0';
}
else
{
for(j=0;j<itb;j++)
ta[j]=tb[j];
ita=itb;
}
}
if(da+db!=0)
{
for(i=ita;i>da+db;i--)ta[i]=ta[i-1];
ta[i]='.';
ita++;
while(ta[ita-1]=='0'&&ta[ita-2]!='.')ita--;
ta[ita]='\0';i=0;
while(ta[i]=='0')i++;
if(ta[i]=='.')i++;
for(j=0;i<ita;i++,j++)ta[j]=ta[i];
ita=j;ta[j]='\0';
}
else
{
while(ta[ita-1]=='0'&&ita>1){ta[ita-1]='\0';ita--;}
}
j=ita/2;
char temc;
for(i=0;i<j;i++)
{
temc=ta[i];
ta[i]=ta[ita-1-i];
ta[ita-1-i]=temc;
}
ta[ita]='\0';
strcpy(a,ta);
}
int main()
{
char a[N],b[N];
int i,j;
while(1)
{
scanf("%s %s",a,b);
multy(a,b);
printf("%s\n",a);
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -