兩個實數相乘

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

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);      

相關文章
相關標籤/搜索