求循环小数

对于任意的真分数 N/M ( 0 < N < M ),均可以求出对应的小数。如果采用链表表示各个小数,对于循环节采用循环链表表示,则所有分数均可以表示为如下链表形式。

输入: N M

输出: 转换后的小数(不超过 50 )

要求: 仅编写将分数转换为小数的函数 change( int n, int m, NODE * head ) 。

测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示

  1. 1 8↵

以文本方式显示

  1. 0.125↵

1秒 64M 0
测试用例 2 以文本方式显示

  1. 29 33↵

以文本方式显示

  1. 0.87878787878787878787878787878787878787878787878787↵

1秒 64M 0
测试用例 3 以文本方式显示

  1. 7 18↵

以文本方式显示

  1. 0.38888888888888888888888888888888888888888888888888↵

1秒 64M 0
测试用例 4 以文本方式显示

  1. 2 7↵

以文本方式显示

  1. 0.28571428571428571428571428571428571428571428571428↵

1秒 64M 0

预设代码

前置代码

 1 /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
 2
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5
 6 typedef struct node
 7 {   int         data;
 8     struct node * next;
 9 } NODE;
10
11 void output( NODE * );
12 void change( int, int, NODE * );
13
14 void output( NODE * head )
15 {   int k=0;
16
17     printf("0.");
18     while ( head->next != NULL && k<50 )
19     {   printf("%d", head->next->data );
20         head = head->next;
21         k ++;
22     }
23     printf("\n");
24 }
25
26 int main()
27 {   int n, m;
28     NODE * head;
29
30     scanf("%d%d", &n, &m);
31     head = (NODE *)malloc( sizeof(NODE) );
32     head->next = NULL;
33     head->data = -1;
34     change( n, m, head );
35     output( head );
36     return 0;
37 }
38
39 /* PRESET CODE END - NEVER TOUCH CODE ABOVE */

编写代码如下:

  1 /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */
  2
  3 #include <stdio.h>
  4 #include <stdlib.h>
  5
  6 typedef struct node
  7 {
  8     int         data;
  9     struct node * next;
 10 } NODE;
 11
 12 void output(NODE *);
 13 void change(int, int, NODE *);
 14
 15 void output(NODE * head)
 16 {
 17     int k = 0;
 18
 19     printf("0.");
 20     while (head->next != NULL && k<50)
 21     {
 22         printf("%d", head->next->data);
 23         head = head->next;
 24         k++;
 25     }
 26     printf("\n");
 27 }
 28
 29 void change(int n, int m, struct node *head)
 30 {
 31     struct node *p, *left, *p1, *head_yu, *yu1;
 32     int chu;
 33     int shang;
 34     int i, k;
 35     int yu;
 36     chu = n;
 37     p = (NODE *)malloc(sizeof(struct node));
 38     left = (NODE *)malloc(sizeof(struct node));
 39     shang = chu * 10 / m;
 40     yu = chu * 10 % m;
 41     p->data = shang;
 42     head->next = p;
 43     p1 = p;
 44     if (yu == 0){
 45         p->next = NULL;
 46         return;
 47     }
 48     if (yu == chu){
 49         p->next = p;
 50         return;
 51     }
 52     left->data = chu;
 53     head_yu = yu1 = left;
 54     left->next = NULL;
 55     chu = yu;
 56     for (k = 1; k <= 49; k++){
 57         int count = 0;
 58         struct node *c;
 59         c = head_yu;
 60         while (c != NULL){
 61             if (c->data == chu){
 62                 count++;
 63                 break;
 64             }
 65             else{
 66                 c = c->next;
 67                 count++;
 68             }
 69         }
 70         if (c!=NULL&&c->data == chu){
 71             struct node *zhuan;
 72             int count2;
 73             zhuan = head;
 74             for (count2 = 1; count2 <= count; count2++)
 75                 zhuan = zhuan->next;
 76             p->next = zhuan;
 77             return;
 78         }
 79         p = (NODE *)malloc(sizeof(struct node));
 80         left = (NODE *)malloc(sizeof(struct node));
 81         shang = chu * 10 / m;
 82         yu = chu * 10 % m;
 83         p->data = shang;
 84         p1->next = p;
 85         p1 = p;
 86         if (yu == 0){
 87             p1->next = NULL;
 88             break;
 89         }
 90         left->data = chu;
 91         yu1->next = left;
 92         yu1 = left;
 93         left->next = NULL;
 94         chu = yu;
 95     }
 96 }
 97
 98 int main()
 99 {
100     int n, m;
101     NODE * head;
102
103     scanf("%d%d", &n, &m);
104     head = (NODE *)malloc(sizeof(NODE));
105     head->next = NULL;
106     head->data = -1;
107     change(n, m, head);
108     output(head);
109
110     return 0;
111 }
112
113 /* PRESET CODE END - NEVER TOUCH CODE ABOVE */
时间: 2024-08-10 00:04:47

求循环小数的相关文章

求循环小数的表示以及循环节长度

问题: 输入整数a和b,输出a/b的循环小数表示以及其循环节长度.例如 a=5 b=43 小数表示为0.(116279069767441860465),循环节长度为21: 分析: 长除法的计算过程 ①mod = a%b: ②小数 = (mod*10) / b: ③mod = (mod*10)%b: 循环②③步,当出现重复的余数的时候,也就是循环节出现了 注意事项: 当循环上述2.3步骤时,出现余数为零的情况,即计算结果不是循环小数时,直接输出索引值,循环节长度为0. C++实现: 1 #incl

Repeating Decimals (计算循环小数)

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

nyoj 329 循环小数【KMP】【求最小循环节长度+循环次数+循环体】

循环小数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述 我们可爱的 c小加 近段儿正在潜心研究数学,当他学习到循环小数这一部分时不是太明白循环体是什么意思(比如说3.23232323的循环体是23.2323.23232323),假设我们现在的循环小数都是严格循环的并且有限的,也就是说不出现2.16666666(循环体为6,长度为1)的情况,只有123123这样的循环出现.给他一个小数,他需要找出最小循环体的长度.循环体和循环的次数,请你帮他解决这个问题. 输入 输

uva202:循环小数

题意: 给出两个数n,m,0<=n,m<=3000,输出n/m的循环小数表示以及循环节长度. 思路: 设立一个r[]数组记录循环小数,u[]记录每次的count,用于标记,小数计算可用 r[i]=n*10/m;n=n*10%10 直到n为0或u[n]!=0(找到循环节) 涉及到两个知识点:n/m的余数在0~m-1之间: 抽屉原理:循环次数最多不超过m+1次 具体见代码. //求循环节 #include<cstdio> #include<cstring> #define

数学小技巧(模拟)求1/n

求1/n(是循环小数只输出第一个循环节) 思路:模拟求余 http://acm.nyist.net/JudgeOnline/problem.php?pid=330 #include<iostream> #include<string.h> #include<stdio.h> using namespace std; int vis[100005]; int main() { int d,n; cin>>d; while(d--) { cin>>n

UVA 10555 - Dead Fraction(数论+无限循环小数)

UVA 10555 - Dead Fraction 题目链接 题意:给定一个循环小数,不确定循环节,求出该小数用分数表示,并且分母最小的情况 思路:推个小公式 一个小数0.aaaaabbb... 表示为n/m形式,并且a为整数部分有c位, b为小数部分有d位 那么aaaaa.bbb...和aaaaabbb....分别可以表示为10c?(n/m)和10c+d?(n/m) 两式相减得:aaaaabbb?aaaaa=(10c+d?10c)(n/m) 那么设n1 = aaaaabbb ,n2 = aaa

(hdu step 2.1.8)小数化分数2(小数化分数——包括了循环小数化分数的情况)

题目: 小数化分数2 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2783 Accepted Submission(s): 993   Problem Description Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?请你写一个程序不但可以

无限循环小数化分数、

循环小数分为混循环小数.纯循环小数两大类. 混循环小数可以*10^n(n为小数点后非循环位数),所以循环小数化为分数都可以最终通过纯循环小数来转化. 等比数列法编辑 无限循环小数,先找其循环节(即循环的那几位数字),然后将其展开为一等比数列.求出前n项和.取极限.化简. 例如:0.333333…… 循环节为3 则0.33333.....=3*10^(-1)+3*10^(-2)+……+3^10(-n)+…… 前n项和为:0.3(1-(0.1)^(n))/(1-0.1) 当n趋向无穷时(0.1)^(

求圆周率π的几种方法

方法1:概率法求π的近似值. 概率法又称蒙特卡罗法.假设有一个半径为1的圆,则四分之一圆的面积等于1/4π.通过概率法计算出四分之一圆的面积,也就得到了1/4π.具体过程为:利用随机函数产生横坐标x和纵坐标y(两个值在0~1之间),接着判断由这两个随机数构成的点是否位于1/4圆的区域内,若该点位于1/4圆内则进行计数.由于随机函数生成的点坐标有一定的均匀性,当生成的点足够多时,就可得到阴影内和阴影外点的近似均匀分布. #include <stdio.h> #include <stdlib