vj1010:高精乘+细心模拟
这题的话思路挺简单的,主要是打一个高精乘,然后考虑一些细节的东西
码得挺少时间的,但是调错调了很久...
讲一下思路吧:
就是读入的时候,先把小数点去掉,mark一下小数点的位置
去掉小数点之后也就进行高精乘法即可,去掉前导零
之后计算一下小数点的位置
再去掉小数点后多余的零
以及特判k=1的情况,直接输出答案
细节的地方主要就是在模拟上吧,
我WA了几次:
1.当小数点后面没有数字的时候,当然不需要输出小数点...这个没有考虑进去
2.没有特判k=1的情况,因为答案是放在c数组里,所以当k=1的时候,没有答案
3.数组开小了....
附上代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; char s[201]; int n,m; int l,mark; bool f; int a[100050],b[101],c[100001]; void into(){ l=strlen(s); int i=1; f=true; while(i<=l){ if(s[i]=='.' && f){ mark=i; f=false; } else{ a[i]=s[l-i]-'0'; i++; } } mark=l-mark; l=i-1; for(int j=mark;j<l;j++) a[j]=a[j+1]; for(int j=1;j<=l;j++){ b[j]=a[j]; } } int main(){ freopen("input.txt","r",stdin);freopen("output.txt","w",stdout); //freopen("data.txt","r",stdin); while(cin>>s>>n){ if(n==1){ cout<<s<<"\n"; continue; } memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); mark=0; into(); l-=1; int bl=l; int sum=mark-1; for(int k=2;k<=n;k++){ memset(c,0,sizeof(c)); for(int i=1;i<=l;i++) for(int j=1;j<=bl;j++){ c[i+j-1]+=(a[i]*b[j]); c[i+j]+=(c[i+j-1]/10); c[i+j-1]%=10; } l+=bl; l++; mark=sum*k; while(l>1 && !c[l] && l>mark) l--; for(int i=1;i<=l;i++) a[i]=c[i]; } for(int i=l;i>mark;i--){ printf("%d",c[i]); } int t=1; for(int i=1;i<=mark;i++){ if(c[i]==0){ t++; } else break; } if(t-1==mark){ cout<<"\n"; continue; } else{ cout<<"."; for(int i=mark;i>=t;i--){ printf("%d",c[i]); } cout<<"\n"; } } fclose(stdin); fclose(stdout); return 0; }