http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28517
思路:(1)先预处理,讲输入的小数的末尾的0去掉,并记录小数点的位置,然后倒叙存放在数组里,
(2)进行连乘运算,两个循环。
重点注意运算之后数组的长度需要准确记录下来。
#include<stdio.h> #include<string.h> #define N 200 void add(); int reverse(); void summ(); int sum[N],b[N],n,time[N]; char a[N]; int l,len,k; int main(){ while(scanf("%s%d",a,&n)!=EOF){ l=0; memset(b,0,sizeof(b)); memset(sum,0,sizeof(sum)); // memset(time,0,sizeof(time)); l=len=k=strlen(a); int flag=reverse(); for(int i=1;i<n;i++){ add(); summ(); } int f=0; for(int i=l-1;i>=0;i--){ if(i==n*(len-flag)-1){ printf("."); } if(sum[i]==0&&f==0&&i>=n*(len-flag)){ continue; } f=1; /*if(f==0){ if(sum[i]==0&&i>=n*(len-flag)) continue; else{ f==1; } }*/ printf("%d",sum[i]); } printf(" "); } return 0; } int reverse(){ int flag=0; int t=0; k=0; for(int i=len-1;i>=0;i--){ if(a[i]=='.'){ flag=i;t=1; continue; } if(a[i]=='0'&&t==0){ continue; } t=1; b[k]= sum[k]=a[i]-'0'; k++; } /* for(int i=0;i<len-1;i++){ printf("%d ",sum[i]); } printf(" %d ",flag);*/ len=k; return flag; } void add(){ memset(time,0,sizeof(time)); for(int i=0;i<l;i++){ for(int j=0;j<len+1;j++){ time[i+j]+=sum[i]*b[j]; } } for(int i=0;i<l+len;i++){ sum[i]=time[i]; } /*for(int i=0;i<len+l-1;i++){ printf("%d ",sum[i]); } printf(" ");*/ } void summ(){ l+=len-1; for(int i=0;i<l;i++){ int s=sum[i]; if(s>=10){ sum[i]=s%10; sum[i+1]+=s/10; if(i==l-1) { l++; break; } } } }