以前分享過兩個實數相減的代碼,是先將合法的字符串轉化爲整型數組來存儲,而後分爲小數點前、後兩部分分別作運算。相減過程有點複雜,要考慮的狀況很多,但就判斷符號正負就有比較多的狀況。最後仍是很好的實現了問題的要求。
今天要貼的代碼是兩個實數相乘問題,因爲具體算法步驟題目已經給出,因此按步驟編寫就出來了。
編譯環境是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);
}