两个实数相乘

    之前分享过两个实数相减的代码,是先将合法的字符串转化为整型数组来存储,然后分为小数点前、后两部分分别做运算。相减过程有点复杂,要考虑的情况不少,但就判断符号正负就有比较多的情况。最后还是很好的实现了问题的要求。
    今天要贴的代码是两个实数相乘问题,由于具体算法步骤题目已经给出,所以按步骤编写就出来了。
    编译环境是DEVC++
    如有问题或发现错误 欢迎指出~~

/*

  题目3
   两个实数相乘!!!
   例如:输入string a string b ;计算 c=a*b; 返回c。
     算法提示:
    1、记录小数点在a、b中的位置,算出小数点需要后移的的位数
     2、去掉a、b的小数点,将a、b化为整数相乘
     3、输出结果注意小数点所在的位置
*/     
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>

#define MAXSIZE 512

void ssxc(char *,char *);/////实数相乘!!! 

int panduan(char *);    ///判断正确与否 

int zhuanhua(char *,int *);///////转化为整数 

void xc(int *,int *,int *);//////相乘

int main(void)
{

    char str1[MAXSIZE],str2[MAXSIZE];

    printf("请输入两个实数\n");

    scanf("%s%s",str1,str2); 

    ssxc(str1,str2);

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

你可能感兴趣的:(c,c语言练习)