蓝桥杯 历届试题 小数第n位(c语言)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39111912/article/details/89214102
小数第n位
时间限制: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

思路:

      模拟手算除法的过程:被除数除以除数得到商和余数,要想算小数点以后的数,即余数乘10除以除数得到商和余数,依此类推

      注意避免超时

超时代码:

#include <stdio.h>
int main()
{
	long long int a,b,n,r,r1,r2,r3,i;
	scanf("%lld%lld%lld",&a,&b,&n);
	r=a%b;
	for(i=1;i<=n-1;i++)
	{
		r=r*10%b;
		
	}
	r1=r*10/b;
	r2=r*10%b*10/b;
	r3=r*10%b*10%b*10/b;
	printf("%lld%lld%lld",r1,r2,r3);
	return 0;
}

正确代码:

#include <stdio.h>
int main()
{
	long long int a,b,n,r,r1,r2,r3,i,c;
	scanf("%lld%lld%lld",&a,&b,&n);
	r=a%b;
	c=(1000000000%b)*(1000000000%b);
	for(i=18;i<=n-1;i=i+18)
		r=r*c%b;
	if(i-(n-1)!=18)
		for(i=i-18+1;i<=n-1;i++)
			r=r*10%b;
	r1=r*10/b;
	r2=r*10%b*10/b;
	r3=r*10%b*10%b*10/b;
	printf("%lld%lld%lld",r1,r2,r3);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39111912/article/details/89214102