UVA202 UVALive5141 Repeating Decimals

问题链接:UVA202 UVALive5141 Repeating Decimals。基础训练级的问题,用C语言编写程序。

问题简述:输入两个整数numerator和denominator,分别为分子和分母。0≤分子,1≤分母≤3000。输出a/b的循环小数表示以及循环节长度。如果循环周期大于50,只显示50位,之后的全部用“...”表示。

解题思路:先取出整数部分(numerator/denominator的商),然后用余数(numerator%denominator的余数)计算小数点后的各位。每次将余数先乘以10,就可以取出小数及其余数,循环往复。某两个位余数部分相同则表示,则表示这个区间小数点后的位形成循环。

该把该题归类为哪一类,有点困惑,也许归为模拟题是合适的,因为只要模拟人的计算过程就可以了。其实,这个题是一个数学题。

程序中,循环控制条件有点变态,但是是正确的。

AC的C语言程序如下:

/* UVA202 UVALive5141 Repeating Decimals */

#include <stdio.h>

#define MAXN 3000

int decimal[MAXN];
int numerator[MAXN];

int main(void)
{
    int n, d, start, end, i, j;

    while(scanf("%d%d", &n, &d) != EOF) {
        i = 0;
        numerator[i] = n % d;
        decimal[i] = numerator[i] * 10 / d;

        for(i=1; ;i++) {
            numerator[i] = numerator[i-1] * 10 % d;
            decimal[i] = numerator[i] * 10 / d;

            for(j=0; j<i; j++)
                if(numerator[j] == numerator[i])
                    break;
            if(j < i) {
                start = j;
                end = i - 1;
                break;
            }
            if(numerator[i] == 0) {
                start = i;
                end = i;
                break;
            }
        }

        printf("%d/%d = %d.", n, d, n / d);
        for(i=0; i<start; i++)
            printf("%d", decimal[i]);
        printf("(");
        if(end - start + 1 > 50) {
            for(i=start; i<start+50; i++)
                printf("%d", decimal[i]);
            printf("...");
        } else {
            for(i=start; i<=end; i++)
                printf("%d", decimal[i]);
        }
        printf(")\n");
        printf("   %d = number of digits in repeating cycle\n\n", end - start + 1);
    }

    return 0;
}
时间: 2024-10-28 08:48:28

UVA202 UVALive5141 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 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, &

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 模拟

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

Repeating Decimals (计算循环小数)

//计算循环小数,并找出循环节以及循环节的长度,最后输出时若循环节大于50最后输出省略号. //求循环小数,记录被除数,若被除数相同了则证明循环了. //注意:即使是循环小数,但可能并不是从第一位小数开始循环 #include <iostream> #include<cstdio> #include<cstring> using namespace std; int rm[1010]; int vis[1000010]; int rec[1000010]; int ma

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 题解

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

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,