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

上文链接:蓝桥杯之分考场-深度优先遍历(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;
}

下文链接:蓝桥杯之猴子吃桃-递归极度简化(c++实现)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

河南-殷志强

希望我的文章能帮助到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值