以前分享过两个实数相减的代码,是先将合法的字符串转化为整型数组来存储,而后分为小数点前、后两部分分别作运算。相减过程有点复杂,要考虑的状况很多,但就判断符号正负就有比较多的状况。最后仍是很好的实现了问题的要求。
今天要贴的代码是两个实数相乘问题,因为具体算法步骤题目已经给出,因此按步骤编写就出来了。
编译环境是DEVC++
若有问题或发现错误 欢迎指出~~
git
/*算法
题目3
两个实数相乘!!!
例如:输入string a string b ;计算 c=a*b; 返回c。
算法提示:
一、记录小数点在a、b中的位置,算出小数点须要后移的的位数
二、去掉a、b的小数点,将a、b化为整数相乘
三、输出结果注意小数点所在的位置
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define MAXSIZE 512
数组
void ssxc(char *,char *);/////实数相乘!!! 字符串
int panduan(char *); ///判断正确与否 string
int zhuanhua(char *,int *);///////转化为整数 it
void xc(int *,int *,int *);//////相乘
int main(void)
{
char str1[MAXSIZE],str2[MAXSIZE];io
printf("请输入两个实数\n");编译
scanf("%s%s",str1,str2); 分享
ssxc(str1,str2);di
system("pause");int panduan(char *f)
{
int jieguo=1;
char *s=f;
if(*s=='+'||*s=='-')
{
if(*(s+1)=='+'||*(s+1)=='-')
{
printf("输入的符号有误\n");
return 3;
}
jieguo=(*s=='+') ? 1 : 0;
strcpy(s,s+1);
}
for(;*s!='\0';s++)
{
if(*s=='.')
continue;
if(!isdigit(*s))
{
printf("输入中含有非数字\n");
return 3;
}
}
return jieguo;
}
int zhuanhua(char *f,int *a)
{
char *s=f;
int i,l=0;
while(*(s+1)!='\0')
s++;
for(i=0;s!=f;s--)
{
if(*s=='.')
{
l+=i;
}
else
{
a[i]=(*s-'0');
i++;
}
}
a[i]=(*s-'0');
a[i+1]=11; ///终止值
return l;
}
void xc(int *a1,int *a2,int *f)
{
int *x=a1,*y=a2;
int i,j,tem;
i=j=0;
for(i=0;*x!=11;x++,i++)
for(j=i,y=a2;*y!=11;y++,j++)
{
tem=(*x)*(*y)+f[j];
if(tem>=10)
{
f[j]=tem%10;
f[j+1]+=tem/10;
}
else
{
f[j]=tem;
}
}
f[j+1]=11;
}
void ssxc(char *p,char *q)
{
char *s1=p,*s2=q;
//判断正负、输入数的正确性
int zfh;
int z1=panduan(s1),z2=panduan(s2);
zfh = z1 + z2;
if(z1==3||z2==3)
return;
///将字符串转化成能够相乘的整数
int arr1[MAXSIZE],arr2[MAXSIZE],a[2*MAXSIZE];
int len=0,i; //小数点后的位数
len=zhuanhua(p,arr1)+zhuanhua(q,arr2);
printf("%d \n",len);
for(i=0;arr1[i]!=11;i++)
printf("%d",arr1[i]);
putchar('\n');
for(i=0;arr2[i]!=11;i++)
printf("%d",arr2[i]);
putchar('\n');
//////计算
printf("%c", zfh==1 ? '-': '+');
for(i=0;i<MAXSIZE;i++)
a[i]=0;
xc(arr1,arr2,a);
////打印出结果
int *g=a;
i=1;
while(*(g+1)!=11)
{g++;i++;}
for(;g!=a;g--,i--)
{
if(i==len)
putchar('.');
printf("%d",*g);
}
printf("%d\n",*g);
}