zoukankan      html  css  js  c++  java
  • 【USACO 2.4.5】分数化小数

    【USACO 2.4.5】分数化小数

    一、题目

    【USACO 2.4.5】分数化小数

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 28  解决: 6
    [提交][状态][讨论版]

    题目描述

    写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式。如果小数有循环节的话,把循环节放在一对圆括号中。例如, 1/3 = .33333333 写成0.(3) 41/333 = 0.123123123... 写成0.(123) 用xxx.0 成表示整数典型的转化例子: 1/3 = 0.(3) 22/5 = 4.4 1/7 = 0.(142857) 2/2 = 1.0 3/8 = 0.375 45/56 = 0.803(571428)

    输入

    单独的一行包括被空格分开的 N和D, 1 <= N,D <= 100000。

    输出

    小数的表示方法上面说的很明白了,如果输出的长度超过76个字符,每行输出76个。

    样例输入

    45 56

    样例输出

    0.803(571428)

     
    二、分析及代码
    AC代码
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<string>
     7 using namespace std;
     8 int n,d,a[1000009],h[1000009],tot=0;
     9 bool b[1000009];
    10 void write(int a)
    11 {
    12     printf("%d",a);
    13     tot++;if (tot==76) tot=0,printf("
    ");
    14 }
    15 int main()
    16 {
    17     freopen("src/1in.txt","r",stdin);
    18     scanf("%d%d",&n,&d);
    19     printf("%d.",n/d);
    20     //tot表示数的占位情况
    21     int rt=n/d;if (rt==0)tot=1;
    22     while (rt) tot++,rt=rt/10;
    23     tot++;
    24     int j=0,i=0;
    25     //取余数
    26     n=n%d;
    27     //特殊情况判断
    28     if (n==0)printf("0");
    29     //下面循环就小数
    30     while(n)//如果还有余数,也就是还能除的情况,就接着除
    31     {
    32         i++;
    33         if (!b[n])//如果b[n]==0,也就是n这个余数没有出现过的情况
    34         {
    35             b[n]=true;//将n这个余数置为出现
    36             h[n]=i;//表示n这个余数出现的对应位置
    37         }else
    38         {
    39             j=h[n];//余数出现,说明找到了循环节
    40             break;
    41         }
    42         n=n*10;
    43         //a[i]里面存储的就是余数
    44         a[i]=n/d;
    45         n=n%d;//继续找余数
    46     }
    47     int m=i;//m表示小数部分的个数+1
    48     if (j)//如果找到循环节的位置
    49     {
    50         //输出小数点后的非循环节
    51         for (i=1;i<j;i++) write(a[i]);
    52         printf("(");tot++;if (tot==76) printf("
    "),tot=0;
    53         for (i=j;i<m;i++) write(a[i]);
    54         printf(")");tot++;if (tot==76) printf("
    "),tot=0;
    55     }else for (int i=1;i<=m;i++)write(a[i]);
    56     //每出现循环节,说明是整数
    57 
    58     return 0;
    59 }
  • 相关阅读:
    adb
    Android 入门第一课 一个简单的提示框
    JAVA基础入门
    Android环境配置
    Redis_基本类型介绍和指令___3
    Redis_基本类型介绍和指令___2
    Redis_基本类型介绍和指令___1
    Rediss_基本介绍
    int 指令
    关于学习汇编的一些规则的理解(div mul cf of)
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/7385513.html
Copyright © 2011-2022 走看看