首页 > 代码库 > vj1010:高精乘+细心模拟
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;}
vj1010:高精乘+细心模拟
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。