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