当前位置:首页 » 操作系统 » 算法求循环节

算法求循环节

发布时间: 2022-06-18 16:47:50

❶ 4.954954……的循环节是多少用简便方法记作多少

如果无限小数的小数点后,从某一位起向右进行到某一位止的一节数字循环出现,首尾衔接,称这种小数为循环小数,这一节数字称为循环节。 把循环小数写成个别项与一个无穷等比数列的和的形式后可以化成一个分数
对一个大整数求倒数,用牛顿法可以快速达到很高的精度,但需要的空间很大。如果求一个10^300数量级的质数p的倒数,其循环节长度有可能达到p-1,没有一台计算机的内存能够储存整个循环节的数据。如果用普通的除法,只需储存余数,占用的内存不大,可却可能要计算p-1次,不可能算完。则只要有循环节的长度就可以,不用输出循环节的内容,这种方法解决了这个问题。
另外,这个问题的另一种描述是:给定大整数n(可能是质数也可能是合数,且不知道这个数的分解形式),求最小的k使10^k ≡1 (mod n),对a^k ≡1 (mod n),若n与a互素,求分母n的欧拉函数值ψ(n).那么循环节长度k必是ψ(n)的约数;若n与a有公因子,显然无解。根据这个性质,对每个约数试验就可以了。
ψ(n)的求法:
设n=p1^c1*p2^c2*...*pk^ck(pi为素数),
那么ψ(n)=(p1-1)*p1^(c1-1)*(p2-1)*p2^(c2-1)*...*(pk-1)*pk^(ck-1)。
因此求ψ(n)与将n因数分解密切相关,如果n有300位的话,对300位数分解是困难的。当然,以上只是对a^k ≡1 (mod n)(a为与n互素的任意数)形式来讨论的。如果a=2,可能有更好的办法。
事实上提出这个问题的初衷,是发现大数分解问题可以转化为求一个大数的倒数的循环节的长度
给定n,在RSA加密中,n肯定是两个质数的积。设n=p*q,此时1/n的循环节的长度l|gcd(p-1,q-1)。

❷ a/7的循环节怎么求

1/7=0.142857
2/7=0.285714
3/7=0.428571
4/7=0.571428
5/7=0.714285
6/7=0.857154
循环部分数字都为142857
27*n/6=2000
n=12.35
27*12*6=1944
2000-1944=56
56-27*2=2
循环小数尾数为2
符合条件为6/7
a=6
n=16*(6+2)+1=130
设第一车间X,第二车间y
60x+70y=8440
x-y=28
x=80
y=52

❸ 用c语言怎么求循环小数的循环节

1、判断循环的关键是在确定每位小数的时候,判断余数是否出现与之前的相同。

2、例程:

intrepetend(//求循环节的函数,返回值为循环长度,共3个参数
inta,//第一个参数为被除数
intb,//第二个参数为除数
char*Str)//第三个参数为用于存循环节每一位的数组指针
{intRem[255],//用于存余数的整型数组
Div1=a,//把被除数保存下来,因为后面可能会改变被除数的值
Div2=b;//把除数也保存下来,因为后面可能会改变除数的值
if(a==0orb==0)return0;//如果被除数或者除数为0,函数返回0值
if(Div1<0)Div1=Div1*-1;//正负并不影响求循环节,所以被除数和除数都取绝对值
if(Div2<0)Div2=Div2*-1;//正负并不影响求循环节,所以被除数和除数都取绝对值
for(;Div1*10<Div2;){Div1=Div1*10;}
/*如果被除数乘以10小于除数,就通过一个循环不断让被除数乘以10,直到被除数乘以10大于
或者等于被除数,这样可以清除掉小数点后面的0.000000这些多余的数据。*/
Rem[0]=Div1%Div2;//第一次保存余数
for(inti=0;;i++)//用一个死循环检索小数点后面的每一位
{Div1=Rem[i]*10;//每一次的被除数都为前一次余数乘以10
Str[i]=Div1/Div2;//得到第i位小数(0为第1位,1为第2位,以此类推)
Rem[i+1]=Div1%Div2;//保存余数
if(Rem[i+1]==0)//不管小数点后第几位,如果余数为0,说明能除尽,不会出现循环
{Str[0]=0;//循环节为0
return1;}//函数返回1,这是根据你题目中要求的,但我觉得应该设为0比较合理
for(intj=0;j<=i;j++)//再用一重循环比较之前所有的余数,确定循环节起始点
if(Rem[i+1]==Rem[j])
/*判断是否出现循环的关键是判断余数是否和之前的某一次相同。如果当前余数等于之前的某一
次余数,说明开始出现循环。循环点的起点为j,终点为i,循环长度为(i-j)+1位小数,当上述判断为真时,就可以结束函数*/
{for(intk=0;k<=(i-j);k++)Str[k]=Str[j+k];//整理循环节数组
return(i-j)+1;}//函数返回循环长度
}
}

❹ 有没有求真分数化循环小数循环节的简单方法比如:求1/133化成小数后循环节长度是几其中有几个6

有,对于分母末位数字是1,3,7,9的整数,分数值都是纯循环小数。而且通过分子分母同乘一个数,可化成分母末位数字是9,然后分母加1,再除以10,用得数M除分子可从前面向后得到循环节各位数字;用M逐位乘分子各位数字向前加,从后向前得到循环节各位数字。比如1/133=3/399,M=40,向后算是:3除以40得0余3,记住得数写后余数写前写下30,以此方法继续为: 30300207 75351318387279396369 99192324 48 81 12120 3于是1/133=0.007518796992481203计18位循环节,下面我们从后向前计算:末位数字是3,3*40加到前面得1203,0*40不要加,2*40加上变成81203,1*40加上得481203,8*40加得32481203,如此等等直到循环.这是我中学时给出的方法,后来发现与印度佛教算法巧合。M还可用来判别整除性,这里不便详述,将来可看明年出版的《数学试验与发现》一书。丛汲泉

❺ 求能找出一个循环小数循环节的C语言编程,即使最后一段循环节不完整

这个问题实际上就是这样一个问题:
设s是一个字符串,令s^2=ss , s^3=sss , s^n=ssss...s(n个s)。
现在给定一个字符串S,求最短的字符串a,使得a^n=S。
只不过你这个问题还有一个条件,就是最后一个循环节可以不完整。
这个问题,最简单的算法就是枚举所有的可能:
比如2332332332332
先看2是不是,如果不行再看23,不行再看233,233发现可以。
如果233不行,就看2332,。。。。。以此类推。

求给个采纳吧。

❻ 如何求无限循环小数的循环节长度

所有循环小数的分数表示都是
循环节/[1-10^(循环节长度)]
如此代入计算吧

❼ c语言问题,如何求两数相除的循环节

/*判断循环的关键是在确定每位小数的时候,判断余数是否出现与之前的相同。以下是实现的程序,直接写完,思路应该是正确的,但还没有经过验证,不清楚可以加我QQ:20428920*/
int repetend( //求循环节的函数,返回值为循环长度,共3个参数
int a, //第一个参数为被除数
int b, //第二个参数为除数
char *Str) //第三个参数为用于存循环节每一位的数组指针
{int Rem[255], //用于存余数的整型数组
Div1=a, //把被除数保存下来,因为后面可能会改变被除数的值
Div2=b; //把除数也保存下来,因为后面可能会改变除数的值
if(a==0 or b==0) return 0; //如果被除数或者除数为0,函数返回0值
if(Div1<0) Div1=Div1*-1; //正负并不影响求循环节,所以被除数和除数都取绝对值
if(Div2<0) Div2=Div2*-1; //正负并不影响求循环节,所以被除数和除数都取绝对值
for(;Div1*10<Div2;){Div1=Div1*10;}
/*如果被除数乘以10小于除数,就通过一个循环不断让被除数乘以10,直到被除数乘以10大于
或者等于被除数,这样可以清除掉小数点后面的0.000000这些多余的数据。*/

Rem[0]=Div1%Div2; //第一次保存余数
for(int i=0;;i++) //用一个死循环检索小数点后面的每一位
{Div1=Rem[i]*10; //每一次的被除数都为前一次余数乘以10
Str[i]=Div1/Div2; //得到第i位小数(0为第1位,1为第2位,以此类推)
Rem[i+1]=Div1%Div2; //保存余数
if(Rem[i+1]==0) //不管小数点后第几位,如果余数为0,说明能除尽,不会出现循环
{Str[0]=0; //循环节为0
return 1;} //函数返回1,这是根据你题目中要求的,但我觉得应该设为0比较合理
for(int j=0;j<=i;j++) //再用一重循环比较之前所有的余数,确定循环节起始点
if(Rem[i+1]==Rem[j])
/*判断是否出现循环的关键是判断余数是否和之前的某一次相同。如果当前余数等于之前的某一
次余数,说明开始出现循环。循环点的起点为j,终点为i,循环长度为(i-j)+1位小数,当上述判断为真时,就可以结束函数*/
{for(int k=0;k<=(i-j);k++) Str[k]=Str[j+k]; //整理循环节数组
return (i-j)+1;} //函数返回循环长度
}
}

❽ 如何求一个分数化成小数后的循环节求算法,或者C++/C程序。

#include <stdio.h>
#include <memory.h>
int main(void)
{
int a, b, t;
int used[10000];//b < 10000
memset(used, 0, sizeof(used));
printf("输入分子,分母:");
scanf("%d%d", &a, &b);

a %= b;//求可以得到小数的部分

//能循环就是出现余数重复出现,则只需找到第一次重复出现的余数
//0是结束标志,先将a置为重复出现,然后每次a = a*10%b求出新得的余数,并检查该余数是否出现过,有则开始重复,无则置为1,继续
for(used[0] = 1, used[a] = 1, a = a*10%b; used[a] != 1 ; used[a] = 1, a = a*10%b)
{
;
}

if(a == 0)
{
printf("有限小数\n");
}
else
{
t = a;
printf("循环小数,循环节:");
do
{
printf("%d", a*10/b);
a = a*10%b;
} while (a != t);
printf("\n");
}
return 0;
}

java求循环节

import java.util.*;
public class Xunhuanjie
{
public static void main(String[] args)
{
int[] d=new int[100];//存放除数
int[] r=new int[100];//存放余数
int m,n,i,j,k;
i=0;
System.out.println("请输入两个数:");
Scanner in=new Scanner(System.in);
m=in.nextInt();
n=in.nextInt();
d[i]=m/n;
r[i]=m%n;
while(true)
{
i++;
d[i]=r[i-1]*10/n;
r[i]=r[i-1]*10%n;
j=0;
while(r[j]!=r[i])
j++;
if(j<i)
break;
}
System.out.print(m+"/"+n+"="+d[0]+".");
for(k=1;k<=j;k++)
System.out.print(d[k]);
System.out.print("[");
for(k=j+1;k<=i;k++)
System.out.print(d[k]);
System.out.print("]\n");
}
}
这个程序是不严谨的,可惜我泛型数组列表学得不好,见谅

比方说7/15,假如一个小学生会怎么算呢?
1)先商0余7,这0就是整数部分了
2)然后补0,就是用余的7*10/15,得4余10
3)然后补0,10*10/15得6,又余10
第三步得的余数就跟前面第二步一样了吧.
这就不用继续算了,循环体肯定是6

大意就是每做一次运算,检测一下这次运算的余数是不是跟之前某次运算的余数相同,如果有,那么从之前那次运算到此次运算得到的商都是循环体(这是因为每步都用一样的算法,决定每步的商的也就只有上一步运算的余数而已)

我表达能力有限,你能明白吗?

热点内容
三星韩版系统安卓套件有什么用 发布:2024-11-07 07:25:27 浏览:441
访问学者回国购车 发布:2024-11-07 07:25:27 浏览:177
算法导论思考题 发布:2024-11-07 07:17:23 浏览:858
python原子操作 发布:2024-11-07 07:11:16 浏览:363
hotmail邮箱服务器地址 发布:2024-11-07 06:55:52 浏览:921
32bitftp 发布:2024-11-07 06:55:50 浏览:313
诗词朗读脚本 发布:2024-11-07 06:47:28 浏览:469
雷霆战机无尽脚本 发布:2024-11-07 06:33:57 浏览:351
二级c需要编译运行吗 发布:2024-11-07 06:33:09 浏览:591
编程器刷机 发布:2024-11-07 06:22:23 浏览:40