蓝桥杯之小数第n位-数组存储+直接计算版(c++实现)

上文链接:蓝桥杯之分考场-深度优先遍历(DFS)+简单逻辑判断简化版(c++实现)_C/C++_weixin_44077556的博客-CSDN博客

资源限制

时间限制:1.0s  内存限制:256.0MB

问题描述

  我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。

        如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式。

  本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始的3位数。

输入格式

  一行三个整数:a b n,用空格分开。a是被除数,b是除数,n是所求的小数后位置(0

输出格式

  一行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

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

{

quotient[i++]=mod/b;

mod%=b;

}

else//小数点后存储商

{

quotient[i++]=mod/b;

mod=mod%b*10;

}

}

for(int j=i-3;j

{

cout<

}

cout<

return 0;

}


上述思路能解决的结果是不够大的,我在蓝桥上测试时发现仅为60分,所以进行了以下改变。

直接计算版

我的思路

经观察我们不需要存储结果也能知道n位置及以后的3位:我们只需要定位到在小数点后n位置并计算出其后三位结果即可。由上面算法能够确定位置,接下来只需要计算即可。算法的运行结果展示如下:**果然满分**。

算法展示


#include

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

{

i++;

mod%=b;

}

else

{

if(i>=(n+count))//定位小数点后n位,打印结果

{

cout<

}

i++;

mod=mod%b*10;

}

}

cout<

return 0;

}

你可能感兴趣的:(蓝桥杯之小数第n位-数组存储+直接计算版(c++实现))