小数精确相乘
#include <iostream>
#include <cassert>
using namespace std;void PrintMulNum(char *numA,int alen,char *numB,int blen)
{if (NULL == numA || NULL == numB || alen <=0 || blen <=0){return;}int *num1 = new int[alen-1];//減去小數點1位assert(num1 != NULL);int *num2 = new int[blen-1];assert(num2!=NULL);int *result = new int[(alen-1)*(blen-1)+1];assert(result != NULL);memset(result,0,((alen-1)*(blen-1)+1)*sizeof(int));int i,j,pointCountA=0,pointCountB=0,posA,posB;for (i=0,j=0; j < alen;j++){if (numA[alen-1-j]!='.'){pointCountA++;num1[i]=numA[alen-1-j]-'0';cout << "---"<<i<<"---"<<num1[i]<<endl;i++;}else{posA = pointCountA;//計算小數點位置}}for (i=0,j=0; j < blen;j++){if (numB[blen-1-j]!='.'){pointCountB++;num2[i]=numB[blen-1-j]-'0';cout << "---"<<i<<"---"<<num2[i]<<endl;i++;}else{posB = pointCountB;}}int point = posA+posB;//計算result中小數點位置for (i=0; i < alen-1; ++i){for (j=0;j<blen-1;++j){result[i+j] +=num1[i]*num2[j];cout << "---"<<i+j<<"---"<<result[i+j]<<endl;}}for (i=0;i < (alen-1)*(blen-1);i++){if (result[i] > 9){result[i+1] += result[i]/10;result[i] %=10; }cout << "---"<<i<<"---"<<result[i]<<endl;}bool flag = true;for (i=(alen-1)*(blen-1);i>=0;--i){if (result[i]==0&&flag){continue;}else{if (i ==point){cout <<result[i]<<".";}elsecout << result[i];flag=false;}}delete[] num1;delete[] num2;delete[] result;return;}int main()
{char *n="1.243";char *m="3.241555";PrintMulNum(n,strlen(n),m,strlen(m));
}
總結