我的刷题之旅1

我的刷题之旅1_第1张图片

 这题目一看,很多小伙伴可能觉这玩意肯定一遍过,然而,我当时也是这么想的,但现实是,磨了几天才写出来。这次我们选择先分析题:

首先我们来思考,我们要输入两个整数但求的却是小数,要怎么处理呢?

有两种方法:

1.我们可以在a/b的时候在a面前乘以1.0来使a变成小数(因为在c语言中,‘/’号有这样的法则,整数除整数等于整数,且是属于去尾的那种,而只要除号两端任意一端有小数,都可以为小数。)所以我们可以写这样的代码:

#include
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        printf("%.10f\n",1.0*a/b);
    }
    return 0;
}

嗯,这里有几点注意的:首先是输入,在scanf中你是怎样输入的,就要用怎样的格式:比如我输入a b中间隔了一个空格,那么在scanf的引号里也要是%d %d的格式,而如果我们如果输入的是啊a,b那么输出也要变%d,%d。这是要注意的,还有一个就是多组输入,一般我们就是用上面这个方法,可以学一下,具体的理论我也不太清楚。

这里有一点特别要注意的:养成经常打换行符的好习惯,我这么久都过不了就是因为没打换行符,也就是'\n',除非题目格式特殊要求,不然一般都是要打换行符的。

好,继续介绍第二种方法。强制转化。我们可以在a或者b的前面加一个括号里面写上double。也可以过,如:

#include
int main()
{
    int a,b;
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        printf("%.10f\n",(double)a/b);
    }
    return 0;
}

这也是可以的,当然,同样的你也可以在b前面加也可以,但是不可以这样(double)(a/b)这样是错误的,因为它这样的话就会让a/b先计算出去小数尾的整数;再加小数点。同样这样也是错的。(这里提一嘴,%f这里变为%.10f的意思是保留十位小数).

拓展一个小知识:这里为什么不用float类型呢?那是因为错了,到底为什么错了呢?重点来了:因为float为单精度浮点类型y十进制的有效位数为7位,double双精度类型的十进制的有效位数为16位,这就说明白了刚刚为什么float不行。

最后想在激励一下自己:

林清玄:"人也要像珍珠贝一样,养成重塑伤口的本事。转化成生命的创伤,使它变成美丽的珍珠。”愿每一个受过伤的孩子都能坚强的重新站起来,去努力追寻心中的光·。

你可能感兴趣的:(C语言,学习)