24.求小数的某一位【小学奥数7830】

分数a/b化为小数后,小数点后第n位的数字是多少? 输入:
三个正整数a,b,n,相邻两个数之间用单个空格隔开。0<a<b< 100,1<=n<=10000。 输出:
一个数字。 样例输入:
1 2 1 样例输出:
5

思路转载的:https://blog.csdn.net/lq1990717/article/details/112343520




乘十取整

设r为a/b的余数,q是整数商
∵a/b=q······r

∴a/b=q+r/b 

/*
被除数=整数商*除数+余数
被除数/除数=整数商+余数/除数
整数商=(被除数-余数)/除数
*/
q是结果的整数部分,r/b是结果的小数部分
假设r/b的值为0.r1r2r3r4...ri是每一位的数字
按位权展开公式:r/b=d1*(10-1)+d2*(10-2)+d3*(10-3) //10的-1次方,10的-2次方……
两边*10

10r/b=d1+d2*(10-1)+d3*(10-2)······ //即10r/b=d1.d2d3······


10r/b的余数为10r%b
整数部分为(10r/b-10r%b)/b=d1
d1就是十分位数字
将(10r/b-10r&b)/b再乘以十,并分离整数部分,得到的就是百分位数字
∴求小数各位数字的方法是:乘十取整





数制:求某位的数字

求任意进制数字整数部分某位的方法是:除基取余
求任意进制数字小数部分某位的方法是:乘基取整
其中“基”是指该数制的基数,如十进制的基数是10,十六进制的基数是16。





除法竖式

捕获.PNG


设被除数为r,使r=a%b,作为做出被除数,除数一直是b
被除数r比除数b小,r*10,然后求r/b,得到的商写在商的位置,即为十分位的值
得到的余数作为新的被除数
此时被除数r比除数b小,r*10,然后求r/b,得到的商即为百分位的值
得到的余数做新的被除数
不断循环,第n次循环求出的商即为小数点第n位





题解代码

#include <iostream>
using namespace std;
int main()
{
    int a,b,n,r;
    cin>>a;
    cin>>b;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        a=a*10;
        r=a/b;
        a&=b;
    }
    cout<<r;

}





解法一:数制:乘基取整

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a, b, n;
    cin>>a>>b>>n;
    int r = a % b;//r为分子
    int d;//d为某一位的数字
    for(int i = 1; i <= n; ++i)
    {
        r *= 10;
        d = (r - r % b) / b;//求r除以b的商,为第i位小数
        r %= b;//r的新值为(10r)%b
    }
    cout<<d;//第n次求出的d就是第n位数
    return 0;
}





解法二:模拟除法竖式

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a, b, n;
    cin>>a>>b>>n;
    int r = a % b;//初始的被除数
    int d;//d为某一位的数字
    for(int i = 1; i <= n; ++i)
    {
        r *= 10;//被除数乘以10
        d = r / b;//求出此次相除得到的商,即为第i位的数字
        r %= b;//余数作为新的被除数
    }
    cout<<d;
    return 0;
}