Repeating Decimals (计算循环小数)

//计算循环小数,并找出循环节以及循环节的长度,最后输出时若循环节大于50最后输出省略号。
//求循环小数,记录被除数,若被除数相同了则证明循环了。
//注意:即使是循环小数,但可能并不是从第一位小数开始循环
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int rm[1010];
int vis[1000010];
int rec[1000010];
int main()
{
    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        memset(vis,0,sizeof(vis));
        memset(rec,0,sizeof(rec));
        printf("%d/%d = %d",a,b,a/b);
        a=a%b;
        int k=1;  //k为小数点后循环整数个数
        while(!vis[a]&&a)
        {
            vis[a]=k;   //记录被除数出现的位置
            rec[k]=a;   //记录被除数
            a=a*10;   //一直保持被除数记录为整数
            rm[k++]=a/b;  //记录小数点后的循环整数
            a=a%b;
        }
        printf(".");
        for(int i=1;i<k&&i<=50;++i)
        {
            if(a&&a==rec[i])
                printf("(");
            printf("%d",rm[i]);
        }
        if(!a)
            printf("(0");
        if(k>50)
            printf("...");
        printf(")\n");
        printf("   %d = number of digits in repeating cycle\n\n",a?(k-vis[a]):1);   //注意打印空行
    }
    return 0;
}
时间: 2024-11-09 17:00:34

Repeating Decimals (计算循环小数)的相关文章

UVA202循环小数Repeating Decimals

Repeating Decimals The decimal expansion of the fraction 1/33 is , where the is used to indicate that the cycle 03 repeats indefinitely with no intervening digits. In fact, the decimal expansion of every rational number (fraction) has a repeating cyc

UVA202 UVALive5141 Repeating Decimals

问题链接:UVA202 UVALive5141 Repeating Decimals.基础训练级的问题,用C语言编写程序. 问题简述:输入两个整数numerator和denominator,分别为分子和分母.0≤分子,1≤分母≤3000.输出a/b的循环小数表示以及循环节长度.如果循环周期大于50,只显示50位,之后的全部用"..."表示. 解题思路:先取出整数部分(numerator/denominator的商),然后用余数(numerator%denominator的余数)计算小数

UVa 202 Repeating Decimals

计算循环小数的循环节 输入整数a和b(0<=a<=3000,1<=b<=3000),输出a/b的循环小数表示以及循环节长度. 例如,a=5,b=43,小数表示为0.(116279069767441860465),循环字节长度为21 可以用数组储存数字,模拟竖式除法来解决. 附AC代码: 1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 5 const int MAX=3050;

UVa 202 Repeating Decimals【模拟】

题意:输入整数a和b,输出a/b的循环小数以及循环节的长度 学习的这一篇 http://blog.csdn.net/mobius_strip/article/details/39870555 因为n%m的余数只可能是0到m-1中的一个,根据抽屉原理,当计算m+1次时至少存在一个余数相同 发现看了题解理解起来也好困难啊, 后来手动画了一下5/7的竖式除法的式子,,理解一些了 1 #include<iostream> 2 #include<cstdio> 3 #include<c

UVa 202 Repeating Decimals 题解

The decimal expansion of the fraction 1/33 is 0.03, where the 03 is used to indicate that the cycle 03 repeats inde?nitely with no intervening digits. In fact, the decimal expansion of every rational number (fraction) has a repeating cycle as opposed

Repeating Decimals UVA - 202

1 The decimal expansion of the fraction 1/33 is 0.03, where the 03 is used to indicate that the cycle 03 2 repeats indefinitely with no intervening digits. In fact, the decimal expansion of every rational number 3 (fraction) has a repeating cycle as

uva 202 Repeating Decimals 模拟

弱校连萌题目链接:http://acm.bnu.edu.cn/v3/contest_show.php?cid=5772#problem/G 需要先想到出现循环节意味着出现了以前出现过的余数 然后就自己手写一个大数除法 后来看别人博客发现其实不用STL也可以 检查余数是否出现过可以是常数级的 因为除数不大于3000 所以开一个3010的数组来存余数标记即可 当然我还是用的map 因为复杂度实在太松了 这题烦得很 注意“输出前50位”是指所有数字加起来50位... 不是小数点后50位...(哭晕在厕

UVa202 Repeating Decimals

#include <stdio.h>#include <map>using namespace std; int main(){    int a, b, c, q, r, places;    map<int, int> rmap;    pair<map<int, int>::iterator, bool> pr;    int qarr[50];    while (scanf("%d %d", &a, &

202 - Repeating Decimals

#include <stdio.h> #include <string.h> using namespace std; int isExist(int* list, int size, int val); int main(){ int m, n, divided[5000], count, idx, flag; char decimal[5000]; while(scanf("%d%d", &m, &n) != EOF){ count = 0,