CH5 Problem F: C语言习题5.13--趣味取小数

时间:2023-02-27 14:32:10

趣味取小数。

Description

听说大家最近学得不错,教授就准备考考大家,先做出来有奖哦~

编写一个函数,取一个小数的第n(-10<=n<=16)位,当n大于0时,从小数点位置开始向右取小数部分第n位,当n小于0时,从小数点位置开始向左取整数部分的第n位。

#include <stdio.h>
#include <string.h>
int get_one_digit(double num,int n); /*
函数声明*/
int main()
{
    double number;
    int n;
    int digit;  /*
第n位数字*/
    scanf("%lf%d",&number,&n); /*输入数据*/
    digit=get_one_digit(number,n);  /*调用查找第n位数字并将数字返回复制给digit*/
    printf("%d\n",digit);
    return 0;
}

主程序已给出,请编写get_one_digit函数并提交该函数即可

Input

一个小数,取小数的第n

Output

小数的第n

Sample Input

5.5772156649015328  10

Sample Output

9



这道题肯定是分n<0和n>0的情况来做的。

当输入的n大于零时,

我们只看小数部分,所以我们可以对变量进行类型转换,去掉整数部分

具体做法为:num=num-(long)num;

同样的这时我们在将num*10;num=num-(long)num;这时候我们便把小数点后第一位数字也去掉了

假设我们需要输出小数点后第n位的那一个数字,相当于去掉小数点后n-1位得到新的num,旧的num的第n位小数是新的num的第一位小数,这时我们再将num*10,输出num的整数部分就可以了

具体做法为:

x=num;

        while(n>0)

        {

            x=x-(long)x;                                  //取小数部分

            x=x*10;                                      

            n--;                                          //控制循环

        }

当n小于零时,

同样我们只需要看整数部分,num=(long)num取整。

如果我们想得到个位数(即n=-1)我们可以x=num%10;

如果得到想得到十位数字 我们可以num=num/10;x=num%10;

如果要得到第n位数字时我们可以num=num/10的n-1次方;x=num%10;

具体为:

long y;

        y=(long)num;

        n=-n;

        for(i=1;i<=n;i++)

        {

            x=y%10;

            y=y/10;

        }

所以整个代码为:

#include<stdio.h>

#include<string.h>

#include<math.h>

intget_one_digit(double num,int n);                     //函数声明

int main()

{

    double number;

    int n;

    int digit;                                           //第n位数字

    scanf("%lf%d",&number,&n);                          //输入数据

    digit=get_one_digit(number,n);                       //调用查找第n位数字并将数字返回复制给digit

    printf("%d\n",digit);

 

    return 0;

}

intget_one_digit(double num,int n)

{

    double x;

    if(n>0)

    {

        x=num;

        while(n>0)

        {

            x=x-(long)x;                                  //取小数部分

            x=x*10;                                      

            n--;                                          //控制循环

        }

    return (int)x;                                        //取整

    }

    else

    {

        int i,x;

        long y;

        y=(long)num;

        n=-n;

        for(i=1;i<=n;i++)

        {

            x=y%10;

            y=y/10;

        }

        return x;

    }

}