草庐IT

分数与小数

I am a teacher! 2023-03-28 原文

【例1】求1/n的值。

问题描述

给定个非0的整数n,计算1/n的值。

输入

第一行整数T,表示测试组数。后面T行,每行一个整数 n (1≤|n|≤10^5)。

输出

输出1/n (是循环小数的,只输出第一个循环节)。

输入样例

4

2

3

7

168

输出样例

0.5

0.3

0.142857

0.005952380

       (1)编程思路。

        定义数组int vis[100001];,其中vis[i]表示整数i作为余数是否出现过。初始时,数组vis的各元素值(除vis[0]外)全部置为0,置vis[0]=1,因为若余数为0,表示除法结束。

        模拟竖式除法过程,从num=1开始,先置vis[num]=1(表示余数num出现了),再输出 num*10/n的整数部分(也是当前位的商),同时修改num为num*10%n。若vis[num]==1,则表示余数num已出现,此时要么除尽(num==0),要么构成循环小数,结束除法过程;若vis[num]==0,则继续上面的竖式除法过程。

       (2)源程序。

#include <stdio.h>
#include <string.h>
int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int n;
        scanf("%d", &n);
        if (n<0)  { printf("-"); n = -n;}
        if (n==1) { printf("1\n"); continue; }
        else printf("0.");
        int vis[100001];
        memset(vis, 0, sizeof(vis));
        vis[0] = 1;    // 如果余数为0,表示可以除尽
        int num = 1;
        while (1)
        {
            if (vis[num]) break;
            vis[num] = 1;
            printf("%d", num * 10 / n);
            num = (num * 10) % n;
        }
        printf("\n");
    }
    return 0;
}

        将上面的源程序提交给HDU题库 HDU 2522 A simple problem (http://acm.hdu.edu.cn/showproblem.php?pid=2522),可以Accepted。

【例2】分数化小数

问题描述

编写一个程序,输入一个形如N/D的分数,输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。

例如,1/3=0.33333333… 写成 0.(3),4/2=2 写成 2.0。

输入

输入包含两个整数N和D(1≤N,D≤105)。

输出

输出按照上面规则计算出的小数表达式。如果结果长度大于 76,每行输出76个字符。

输入样例

45 56

输出样例

0.803(571428)

        (1)编程思路。

        同例1的方法,模拟竖式除法过程。但要注意保存已输出的字符数信息(每输出76个字符要换行),还需要寻找出循环节,将其用括号括起来。

        (2)源程序。

#include <stdio.h>
#include <string.h>
int main()
{
    int n,d;
    scanf("%d%d", &n,&d);
    if (n%d==0)
    {
        printf("%d.0\n",n/d);
    }
    else
    {
        int len=0;
        int temp=n/d;
        do {
            len++;
            temp/=10;
        }while (temp!=0);
        len++;           // n/d整数部分的长度加小数点
        printf("%d.",n/d);
        int vis[100001],a[100001];
        memset(vis, 0, sizeof(vis));
        vis[0] = 1;     // 如果余数为0,表示可以除尽
        int num = n%d;
        int cnt=0;
        while (1)
        {
            if (vis[num]) break;
            vis[num] = cnt+1;
            a[++cnt]=num * 10 / d;
            num = (num * 10) % d;
        }
        int i;
        if (num==0)
        {
            for (i=1;i<=cnt;i++)
                 printf("%d",a[i]);
        }
        else
        {
            int k=vis[num];
            for (i=1;i<k;i++)
            {
                printf("%d",a[i]);  len++;
                if (len%76==0) printf("\n");
            }
            printf("(");
            len++;
            if (len%76==0) printf("\n");
            for (i=k;i<=cnt;i++)
            {
                printf("%d",a[i]); len++;
                if (len%76==0) printf("\n");
            }
            printf(")");
        }
        printf("\n");
    }
    return 0;
}

         将上面的源程序提交给洛谷题库 P1530 [USACO2.4]分数化小数 Fractions to Decimals (https://www.luogu.com.cn/problem/P1530),可以Accepted。

【例3】小数化分数

问题描述 

编程序写一个程序,不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。

输入

第一行是一个整数N,表示有多少组数据。

每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

输出

对每一个对应的小数化成最简分数后输出,占一行。

输入样例

3

0.(4)

0.5

0.32(692307)

输出样例

4/9

1/2

17/52

        (1)编程思路。 

        普通纯小数化分数非常方便,将小数部分乘以10的m次方,使得小数部分全部变成整数,之后将这个整数作为分子,10的m次方作为分母,将分子和分母都除以它们的最大公约数,化简为最简分数即可。

       因此,本题主要要考虑无限小数如何转换为分数,无限小数分为无限循环小数和无限不循环小数。而无限不循环小数是不可以化为分数的。题目中给的无限小数都是无限循环小数。其转化为分数的基本思想是将小数扩大倍数,使得扩大后的小数与扩大前的小数部分相同,再将两个小数作差即可得出答案。

       例如,将无限循环小数0.32(692307)转化为分数的过程为

       0.32(692307) * 100 = 32.(692307)

       0.32(692307) * 100000000 = 32692307.(692307)  

       上面两个式子相减得  0.32(692307)* 99999900 = 32692275  ,这样循环小数 0.32(692307) 转化为分数为32692275/99999900,分子与分母再同除以它们的最大公约数1923075,化简为最简分数得 17/52。

       (2)源程序。  

#include <stdio.h>
int gcd(int a, int b)
{
    if (a%b==0) return b;
    return gcd(b, a % b);
}
int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        char s[20];
        scanf("%s", s);
        int t1 = 1, t2, i, k;
        int fz = 0,fm;     // 分别表示分子和分母
         for (i = 2; s[i]!='\0' && s[i] != '('; i++)
        {
            fz = fz * 10 + s[i] - '0';
            t1 *= 10;
        }
        fm = fz;
        t2 = t1;
        if (s[i] != '(')
        {
            k = gcd(t1, fz);
            fz /= k;
            fm = t1 / k;
        }
        else
        {
            for (++i; s[i] != ')'; i++)
            {
               fm = fm * 10 + s[i] - '0';
               t2 *= 10;
            }
            fz = fm - fz;
            fm = t2 - t1;
            k = gcd(fz, fm);
            fz /= k;
            fm /= k;
        }
        printf("%d/%d\n", fz, fm);
    }
    return 0;
}

       将上面的源程序提交给HDU题库 HDU 1717 小数化分数2 (http://acm.hdu.edu.cn/showproblem.php?pid=1717),可以Accepted。

有关分数与小数的更多相关文章

  1. ruby-on-rails - 如何在 ruby​​ 中将小数转换为美元和美分的字符串值? - 2

    我正在我的应用程序中存储成本。成本未在数据库中格式化。例如:00.00存为0,1.00存为1,40.50存为40.5我需要从数据库中读取这些值并将它们转换为表示美元和美分的字符串。例如:0-->cost_dollars="00"&cost_cents="00",1-->cost_dollars="01"&cost_cents="00",40.5-->cost_dollars="40"&cost_cents="50".在ruby​​onrails中有没有一种简单的方法可以做到这一点?或者有人有执行此操作的代码吗?谢谢! 最佳答案 您可

  2. ruby-on-rails - Ruby on Rails - 为评论评级字段按小数点迭代数字 - 2

    我有一个评论模型,允许对产品进行“1-10”评级系统。在我的表单View中,这是我在该字段中吐出1-10的下拉列表的方式...效果很好,但团队现在希望评级系统有0.5个小数,因此可以将某些内容评级为7.5、8.0、8.5等。然而,这让我感到难过...我如何才能在Ruby中更改上面的代码并遍历一组数字并将其递增0.5?(注意:是的,我已经将评分列从整数转换为float。) 最佳答案 你可以这样定义增量(0..10).step(0.5) 关于ruby-on-rails-RubyonRails

  3. ruby-on-rails - 如何格式化小数? - 2

    我需要像这样格式化小数:00.3311.2405.22问题是,当我检索00.33时,它输出为0.33。我尝试了所有方法,但无法正常工作。我可以执行MySQL的Zerofill,但我确实在努力避免这种情况。 最佳答案 sprintf("%05.2f",0.33)#or"%05.2f"%0.33 关于ruby-on-rails-如何格式化小数?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questi

  4. ruby - 贝叶斯分类器分数代表什么? - 2

    我正在使用rubyclassifiergem其分类方法返回根据训练模型分类的给定字符串的分数。分数是百分比吗?如果有,最大差值是100分吗? 最佳答案 这是概率的对数。对于大型训练集,实际概率是非常小的数字,因此对数更容易比较。从理论上讲,分数的范围从接近零的无穷小到负无穷大。10**score*100.0会给出实际概率,确实最大相差100。 关于ruby-贝叶斯分类器分数代表什么?,我们在StackOverflow上找到一个类似的问题: https://st

  5. ruby-on-rails - 从 rails 中的整数或小数中去除逗号 - 2

    整数或小数是否有等效的gsub?gsub应该使用整数吗?基本上,我只是想将小数输入到ruby​​表单中,以及用户能够使用逗号的内容。例如,我希望用户能够输入1,000.99。我试过用before_save:strip_commasdefstrip_commasself.number=self.number.gsub(",","")end但出现以下错误“undefinedmethod`gsub'for8:Fixnum”,其中“8”被替换为用户输入的任何数字。 最佳答案 如果您的字段是Fixnum,它永远不会有逗号,因为Rails必须将

  6. ruby-on-rails - "Good"剥皮分数 - 2

    我正在做一个Rails项目,我们正在运行Flay在上面。它的得分约为1400,我不确定这到底意味着什么。我知道0是理想的,但我不确定什么是好的目标以及项目的现实上限应该是多少。关于评分过程和最终结果是什么,是否有任何好的文档? 最佳答案 这个难题有一个简单的解决方案,它不仅适用于Flay,而且适用于几乎所有“坏”分数:将上限设置为当前分数的任何值,每当它降低时,将其设置为新值.这样,你保证您的目标是现实的(因为它将已经实现)并且你只会进步,或者在最坏的情况下停滞不前,但你永远不会变得更糟。

  7. ruby-on-rails - Rails number_to_currency 删除小数点右边的尾随零 - 2

    我有一个动态生成的表格,它乘以价格*数量。部分价格以美分计算。例如如果某件商品的价格是0.0375,我可以在我的表格中将其显示为number_to_currency(0.0375,:precision=>4)=>$0.0375但是我得到的价格是标准的2位小数的数量number_to_currency(33.95,:precision=>4)=>$39.9500我需要一种方法来去除十进制值的尾随零。请记住,输出位于Model.eachblock中,因此我不确定是否可以有条件地修改精度参数。 最佳答案 尝试指定strip_insigni

  8. ruby - 如何将分数转换为在 ruby​​ 中 float - 2

    我有一个字符串"1/16"我想将它转换为float并乘以45。但是,我没有得到想要的结果。我在script/console中尝试>>"1/16".to_f=>1.0>>"1/16".to_f*45=>45.0如何获得2.81的预期结果大图:我有一个这样的下拉列表:每当用户选择oz值时,我想将它乘以45我也是这样的:first,*rest=params[:volume].to_s.split(//)ifrest.first=="oz"@indprodprice=@prods.orig_price.to_i*first.to_f*28.3495else@indprodprice=@prod

  9. ruby - 如何将 ruby​​ BigDecimal 转换为 2 位小数位字符串? - 2

    我想将RubyBigDecimal对象转换为漂亮的、可打印的货币值。所以我想让它打印到小数点后两位。我该怎么做?如您所见,以下方法均无效:irb(main):033:0>v=BigDecimal("7.1762")=>#irb(main):034:0>v.to_s('2F')=>"7.1762"irb(main):035:0>v.to_s('F')=>"7.1762"irb(main):036:0>v.to_s('%0.2F')=>"0.71762E1"irb(main):037:0>v.to_s('%0.2f')=>"0.71762E1"irb(main):038:0>哪个表达式只会

  10. ruby-on-rails - 在 Ruby on Rails 3 中使用小数 - 2

    我正在尝试计算产品的平均净价。在我的产品模型中,我有:total_sold和:total_net_revenue。在该方法中进行直接除法似乎总是得到0。我使用BigDecimal因为我认为这是问题所在......但是在我对下面代码的最新迭代中,当答案出现时我仍然得到零小数点。defavg_priceBigDecimal(total_sold.to_s)/(BigDecimal(total_net_revenue.to_s)/100)end净收入以美分为单位,这就是我除以100的原因。有人可以指出我做错了什么或应该做什么吗? 最佳答案

随机推荐