该题第一想法是想直接使用double进行数据的存储然后直接输出,实际上看到该题的数据范围就可以排除该方法了,double的精度根本不够!
第二思路是想到去模拟除法的计算,只需不断地对a与b进行除法计算和取模计算即可(这点读者可以自行在纸上尝试)
#include<iostream> #include<vector> #include<cmath> #define int long long using namespace std; vector<int>num; signed main(){ int a,b,n,t; cin>>a>>b>>n; t=a%b;//初始化 for(int i=1;i<=n+3;i++){//只需到n+3位即可 t*=10; num.push_back(t/b); t=t%b; } for(int i=n-1;i<n+2;i++){//输出 cout<<num[i]; } return 0; }
但是上面的代码在面对n特别大的时候会存在超时的情况,因此我们需要进行优化!
下面借鉴自这里
这里我们利用数学知识进行优化,尽量地减少我们模拟的次数
#include<iostream> #include<vector> #include<cmath> #define int long long using namespace std; vector<int>num; signed main(){ int a,b,n,t; cin>>a>>b>>n; a=a%b; while(n>10){//快速逼近需要的位置 a*=1e10; a=a%b; n-=10; } for(int i=1;i<=n+2;i++){//下面则继续模拟除法 a*=10; num.push_back(a/b); a=a%b; } for(int i=n-1;i<n+2;i++){ cout<<num[i]; } return 0; }