上文链接:蓝桥杯之分考场-深度优先遍历(DFS)+简单逻辑判断简化版(c++实现)
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。
本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。
输入格式
一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0<a,b,n<1000000000)
输出格式
一行3位数字,表示:a除以b,小数后第n位开始的3位数字。
样例输入
1 8 1
样例输出
125
样例输入
1 8 3
样例输出
500
样例输入
282866 999000 6
样例输出
914
数组存储版
我的思路
- 整体思路:利用数组的每个索引存储商的结果,存储的方式:某被除数a除于除数b会产生商和余数,而我们只保留商,利用余数进行再次计算。
比如10/8,第一次商为1,余数为2。
2/8,第二次商为0(商为0代表不够借,则此时可知是小数点后的位置,将2向小数后借10变为20,则商为2),余数为4
40/8,第三次商为5,余数为0,
0/8,第三次商为0,余数为0
。。。
由上述过程知在小数点前,保留商存储到数组中,将余数和除数进行再次计算;在小数点后,保留商存储到数组中,将余数乘以10和除数进行再次计算。另外我们可知第一次出现被除数a除以除数b=0,则知此位置为小数点后第一位,需要将余数*10再计算
算法展示
#include <iostream>
using namespace std;
int main()
{
int a,b,n;//被除数a,除数b,小数点后n位置
int quotient[100000];//结果存储数组
cin>>a>>b>>n;
//查找小数点位置
int count=0,temp=a;
while(1)
{
if(temp/b==0)break;//已经进行到个位计算时结束循环
temp%=b;
count++;//记录小数点位置
}
//构造商集
int i=0,mod=a;
while(i<(n+3+count))//只进行到要查找的最终位置时停止计算(简化运算步骤)
{
if(i<count)//小数点前存储商
{
quotient[i++]=mod/b;
mod%=b;
}
else//小数点后存储商
{
quotient[i++]=mod/b;
mod=mod%b*10;
}
}
for(int j=i-3;j<i;j++)//打印输出
{
cout<<quotient[j];
}
cout<<endl;
return 0;
}
上述思路能解决的结果是不够大的,我在蓝桥上测试时发现仅为60分,所以进行了以下改变。
直接计算版
我的思路
- 经观察我们不需要存储结果也能知道n位置及以后的3位:我们只需要定位到在小数点后n位置并计算出其后三位结果即可。由上面算法能够确定位置,接下来只需要计算即可。算法的运行结果展示如下:果然满分。
算法展示
#include <iostream>
using namespace std;
int main()
{
int a,b,n;
int quotient[100000];
cin>>a>>b>>n;
//查找小数点位置
int count=0,temp=a;
while(1)
{
if(temp/b==0)break;
temp%=b;
count++;
}
//计算结果
int i=0,mod=a;
while(i<(n+3+count))
{
if(i<count)
{
i++;
mod%=b;
}
else
{
if(i>=(n+count))//定位小数点后n位,打印结果
{
cout<<mod/b;
}
i++;
mod=mod%b*10;
}
}
cout<<endl;
return 0;
}