版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39111912/article/details/89214102
小数第n位
问题描述
我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。
如果我们把有限小数的末尾加上无限多个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;
}