http://poj.org/problem?id=1001
题目大意:小数的高精度乘法
因为是小数,需要注意的地方非常多,小数点位置,后面和前面去0等问题都得想到
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
char a[200],b[200];
int x;
while(cin>>a>>x){
char c[200];
int point;
for(int i=strlen(a)-1;i>=0;i--){
if(a[i]=='.'){
point=strlen(a)-1-i;
for(int j=i+1;j<strlen(a);j++){
a[j-1]=a[j];
}
a[strlen(a)-1]='\0';
}
}
for(int i=strlen(a)-1;i>=strlen(a)-point;i--){
if(a[i]=='0'){
a[i]='\0';
point--;
}
else break;
}
for(int i=0;i<strlen(a);i++){
if(a[i]=='0'){
for(int j=i;j<strlen(a);j++){
a[j-1]=a[j];
}
a[strlen(a)-1]='\0';
}
else break;
}
strcpy(b,a);
for(int i=0;i<x-1;i++){
int aa[200]={0},bb[200]={0},re[200]={0};
for(int i=0;i<strlen(a);i++){
aa[i]=a[strlen(a)-i-1]-'0';
}
for(int i=0;i<strlen(b);i++){
bb[i]=b[strlen(b)-i-1]-'0';
}
for(int i=0;i<strlen(b);i++){
for(int j=0;j<strlen(a);j++){
re[i+j]+=aa[j]*bb[i];
}
}
int m=strlen(a)+strlen(b)-1;
for(int i=0;i<m;i++){
if(re[i]>=10) {
re[i+1]+=re[i]/10;
re[i]=re[i]%10;
}
}
if(re[m]!=0) m++;
for(int i=m-1;i>=0;i--) c[m-1-i]=(char)(re[i]+'0');
c[m]='\0';
strcpy(a,c);
memset(c,'\0',sizeof(c));
}
point*=x;
int sign1=0,sign2=0;
int ss=strlen(a);
if(ss<point){
for(int i=0;i<point-ss;i++){
for(int j=strlen(a);j>=1;j--){
a[j]=a[j-1];
}
a[0]='0';
}
a[point]='\0';
}
for(int i=0;i<ss-point;i++){
cout<<a[i];
}
int ii=strlen(a)-1;
for(int i=ii;i>=ii+1-point;i--){
if(sign2==0 && a[i]=='0'){
a[i]='\0';
}
else if(a[i]!='0' && sign2==0) {
sign2=1;
break;
}
}
if(sign2==1) cout<<'.';
for(int i=strlen(a)-point;i<strlen(a);i++) cout<<a[i];
cout<<endl;
}
return 0;
}