POJ 1001

来源:互联网 发布:国际船舶网络 编辑:程序博客网 时间:2024/06/05 06:53
#include <stdio.h>#include <iostream>#include <string.h>using namespace std;int ans[200];int intstr[7];int totallen=1;void cal(int n){    int i,j;int a[200];    memset(a,0,sizeof(a));for(i=0;i<n;++i){for(j=0;j<=totallen;++j){           a[j+i]+=ans[j]*intstr[i];}for(j=0;j<=totallen+i;++j){if(a[j]>=10){a[j+1]+=a[j]/10; a[j]=a[j]%10;}}}if(a[totallen+i]!=0)         //两个数相乘,最高存储位为是i+j-1,判断其最高位是否有进位决定ans的有效数字长度       totallen=totallen+i;elsetotallen=totallen+i-1;for(i=0;i<=totallen;++i)ans[i]=a[i];}int main(){    char str[7];int n;while(scanf("%s%d",str,&n)!=EOF){int len=strlen(str);int ptlen=0;int i,j;i=j=0;ans[0]=1;  totallen=0;i=len-1;       //存放数时应该倒过来,即高低位数位置匹配while(i>=0){if(str[i]!='.')   intstr[j++]=str[i]-48;                 i--;}i=0;bool point=false;while(str[i]){if(str[i]=='.'){ptlen=len-i-1;len--;point=true;      //判断是否有小数点break;}i++;}        for(i=0;i<n;++i)       //乘法模拟cal(len);        int ptpos=ptlen*n;if(point==true){for(i=0;i<=ptpos-1;++i)      //如果有小数点,那么小数点后位于最后一块的0全部不要打印if(ans[i]!=0)break;}int bottom=i;bool isPrint=false;if(totallen==ptpos&&ans[totallen]==0)       //最高位为0时,不打印totallen-=1;        for(i=totallen;i>=bottom;i--)if(i==ptpos-1&&!isPrint){printf(".");isPrint=true;    i++;}elseprintf("%d",ans[i]);         printf("\n");}}