读书人

算法题分数变小数路过有分,该如何

发布时间: 2012-01-31 21:28:41 作者: rapoo

算法题,分数变小数,路过有分
参与过 "一个求和的算法,算法高手请进 "
http://community.csdn.net/Expert/TopicView1.asp?id=5362401
会得到额外的分

算法需求
将分数 N/M (N,M为自然数)的形式,转换为小数表示
小数循环部分用括号表示,例如:1/3=0.(3)

输入分子和分母: N,M
输出字符串

输出范例
1/3=.(3)
10/3=3.(3)
1/7=.(142857)
2/8=.25
1024/17=60.(2352941176470588)

private string Calc(int N, int M)
{
// TODO
}
private void button1_Click(object sender, EventArgs ce)
{
Text = Calc(1, 3);
}


[解决办法]
偶路过,呵呵
[解决办法]
最近怎么那么多问算法的哦:)
呵呵
等想想...
[解决办法]
mark
[解决办法]
static void Main(string[] args)
{
Console.Write(Calc(1024, 17));
Console.Read();
}

static private string Calc(int N, int M)
{
// TODO
double a = (double)((double)N / (double)M);
string[] t = a.ToString().Split( '. ');
return t[0] + ".( " + t[1] + ") ";
}
[解决办法]
比以前那题难多了
先要解决
小数位精度 可以 无限制的 除出结果 直到开始有循环体

2是判断 到底是 从 那里 开始循环的

呵呵 期待 其他高手 偶苦思...


[解决办法]
Red_angelX(当你XX你会想起谁)
不对
[解决办法]
听说有分,特来路过一下~
[解决办法]
这个题目如果不限定小数位精度,难!
mark先...
[解决办法]
1/3=.(3)
10/3=3.(3)
1/7=.(142857)
2/8=.25
1024/17=60.(2352941176470588)

从范例里没看出对输出精度规则-_-#
[解决办法]
据说有分,路过一瞧.
[解决办法]
晕 看错了 ()表示循环部分... 重想 丢脸了
[解决办法]
好象有趣,特来好奇一下。
[解决办法]

[解决办法]
关键还是精度问题。还有遇到e和Pai那怎么输出来,无限不循环。。肯定还会有精度的限制的
[解决办法]
Math.中没有转换吗?直接写N/M得不出小数吗?

如果要纯粹自己写算法,得要分析分析,但我觉得好象不大难嘛。
[解决办法]
发现没有小数位规定
路过看看
[解决办法]
是的,注一下吧!
[解决办法]
我也在想模拟笔算,想想人工处理的时候的思路
[解决办法]

//前提:求分数n/m的小数表述。
//尝试:
string TestCoverte(int n,int m)
{
List <int> il=new List <int> ();


while(用户给的精度)
{
if(m> n){il.Add(0);}
else
{
//todo:找出n*10落在m*x或(x+1)之间(0 <x <10)
il.Add(x);
}
}
//调用 一个内部方法,(private的)接受List <int> 对象,并逐个将之转化为char[]然后合成string就可以了。
}
[解决办法]
算法到是不难,但谁能告诉我 我怎么确定他有循环还是没有循环呢?
[解决办法]
这种算法不切合实际(当然硬要算是可以)位数太多,很难表示.

我举个例子:
1/97=0.010309....... (96位循环),
这只是小的.随着数字(也就是说质数变大,循环位数基本上跟数值相当)
[解决办法]
路过,顺便学习!祝你早日解决问题!
[解决办法]
听说有分,特来路过一下~

[解决办法]
难……

[解决办法]
支持一下
[解决办法]
觉得还是要限定一下位数 否则太...
[解决办法]
只能先路过了
干活去……
[解决办法]
看了一下资料(等于复习小学数学).

首先:
第一步: 分解分母,找出因数,判断分数是否是化解成循环小数.如果是:还得区分(纯循环小数,和混循环小数(判断出不循环位数))

第一步是有规则条款可尊循的.

第二步:
比较分子分母,如果分子小于分母,*10 结果字符串补0,再比较,乘10补0到分子大于分母,相除,值加入结果字符串.
余数供再重复上面操作.同判断是否循环.如果是重复几次确认.
如果是混循环小数,就扣除不循环部份再判断.

修正: 分解分母,找出质数,以质数大小大体确定可能循环的小数位数.


没考虑清楚.....提供参考.

请参阅: 小学数学课程讲解
http://www.wm360.cn/resource/070131/004.html
[解决办法]
路.不懂
[解决办法]
Math.里面有很多函数,您看有没有一个!!
[解决办法]
回复: cancerser(都是混饭吃,记得要结帖)


只有2和5为因子的分母是没有循环的. 其他情况都是有循环的.

不含2和5因子的分母是纯循环的(循环从第一位开始)其他情况是混循环的.

[解决办法]
关注一下,请大家帮忙看看这个100分的问题,网址:
http://community.csdn.net/Expert/topic/5366/5366610.xml?temp=.5854761
[解决办法]
应该就是一个精度问题,和算法关系不大吧?
[解决办法]
路过!
[解决办法]
路过,学习了~JF~
[解决办法]
他的要求是要算到出现遁环,但是如果出现圆周率那样的东西,又没有给出一个精度,玩完!
期待高手出现
[解决办法]
没记错的话
自然数 相除
肯定会出现 循环的...
[解决办法]
路过
[解决办法]
路过,JF
[解决办法]
路过分感觉太少了。。。一分两分接起来很郁闷
[解决办法]
路过和参与过```
我要额外分```
[解决办法]
路过,顺便学习
[解决办法]
cancerser(都是混饭吃,记得要结帖) ( ) 信誉:100 Blog 2007-2-28 14:39:32 得分: 0





算法到是不难,但谁能告诉我 我怎么确定他有循环还是没有循环呢?



------------------
抓住关键了
[解决办法]
main(){
if(!分母仅含2,5因素)
找循环节();
}

找循环节()
{
扩展的除法(分子,分母,小数部分) //循环节.length < 分母
从小数部分第一个字节开始取字符串temp, 直到分母个数个字节结束(如果有的话)
{ if(分子 - (temp * 分母 ) = 分子/(temp.length+1))
找到temp为循环节
}
}

扩展的除法(分子,分母,&小数部分)
{
divisor= 分子%分母
小数部分= " "
while(i <分母)
{ 小数部分*=10
小数部分+=divisor/分母
}
}

MARK下,吃饭回来写程序

[解决办法]
路过

[解决办法]
出现循环是因为出现了除得跟前面相同的余数,照这个思路去走~~~~
[解决办法]
1024/17出来的结果就是(1024%17)/17的结果~~~
[解决办法]
路过
[解决办法]
做出来了,可惜比较乱~吃饭先~~~

比较余数就行了,简单的不得了~~~~
[解决办法]
mark
[解决办法]
路过
有分?
[解决办法]
using System;
using System.Text;
using System.Collections.Generic;

class App
{
public static void Main()
{
Message m = new Message(1024, 17);
Message n = new Message(888, 53);
Console.WriteLine(m.ToString());
//输出 1024/17=60.(2352941176470588)括号内循环
Console.WriteLine(n.ToString());
//输出 888/53=16.(7547169811320)括号内循环
Console.Read();
}

}
class Message
{
public int Beichushu;//被除数
public int Chushu;// 除数
private int Yushu;//当前余数
private int Xiaoshuwei=0;//记录当前小数的数位
private int Xunhuankaishiwei;//末了用来记录循环开始于哪一位
private int Xunhuanjieshuwei;//末了用来记录循环结束于哪一位
private List <int> YS = new List <int> ();//余数集合
private List <int> Shang = new List <int> ();//商位数集合
public Message(int Beichushu, int Chushu)
{
this.Beichushu = Beichushu;
this.Chushu = Chushu;
Yushu = Beichushu % Chushu;
Xunhuanjieshuwei=GetXunhuanwei();
}
private int GetXunhuanwei()//计算出循环结束位
{

while (true)
{
if (Xiaoshuwei > Chushu) return -1;//如果小数位超过除数的数值,则表示无限不循环
Yushu = Chu(Yushu, Chushu);
if (Yushu == 0) return -2;//表示可以除得尽
if (YS.IndexOf(Yushu) != -1)//得到了与前面相同的余数,表示循环
{
Xunhuankaishiwei = YS.IndexOf(Yushu) + 1;
return Xiaoshuwei;
}
else
{
YS.Add(Yushu);
}
Xiaoshuwei++;
Yushu *= 10;// "余数补0 "
}
}
private int Chu(int a, int b)//除法,返回余数
{
int shang = a / b;
Shang.Add(shang);
return a % b;
}
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.AppendFormat( "{0}/{1}={2}. ", Beichushu, Chushu, Beichushu / Chushu);


for (int i = 1; i < Shang.Count; i++)//添加小数部分
{
if (i == Xunhuankaishiwei) sb.Append( "( ");
sb.Append(Shang[i]);
}
sb.Append( ")括号内循环 ");
return sb.ToString();
}
}
[解决办法]
一滚而过
[解决办法]
ee365ee() ( ) 信誉:100 Blog 2007-2-28 16:04:39 得分: 0



他的要求是要算到出现遁环,但是如果出现圆周率那样的东西,又没有给出一个精度,玩完!
期待高手出现

--------------------------------------------
有理数都是可以化为分数形式
圆周率是无理数


----------------------------------------

cancerser(都是混饭吃,记得要结帖) ( ) 信誉:100 Blog 2007-2-28 14:39:32 得分: 0



算法到是不难,但谁能告诉我 我怎么确定他有循环还是没有循环呢?


------------------------------------这个才是难题啊
[解决办法]
楼上的, 怎么好几个人都说

算法到是不难,但谁能告诉我 我怎么确定他有循环还是没有循环呢?

是难题,我上面不是回答了么?


首先整数相除不可能出现无限不循环的e和圆周率之类的数,就是根号2这样的都出不来.


判断循环不循环只要分解分母的质数,判断 2和5的情况就行了.

全是2和5 不循环
没有2和5 纯循环
其他 混循环

我上面已经说过了,这结合后面几位的方法,问题就解决. 现在是优化问题了

[解决办法]
UP

[解决办法]
两个有理数相除(分子分母均为有理数),得到的结果一定是:
1、整数
2、有限小数
3、无限循环小数
不可能是无限不循环小数
无限不循环小数=无理数
两个有理数相除不可能得到无理数
[解决办法]
上面错了,sorry, 应该是先把 分子和分母都约成最简以后再计算.

像 3/30 这样的.....要约成 1/10.然后
i=10;
while第一个完 i = 5
while第2个完 i =1

所以没有循环

如果是
1/15
i=15
while第一个完,没执行到,i还是15
while第2个完 i是3
所以有循环
[解决办法]
把分数约简已经有现成的计算机通用算法 "辗转相减移位法 ", 在程序员杂志上有了, 只用到减法和移位等运算,连乘除都不需要.
[解决办法]
syeerzy(快乐永远*先天下之乐而乐*后天下之忧而忧*) ( ) 信誉:95 Blog 2007-03-01 01:12:01 得分: 0


把分数约简已经有现成的计算机通用算法 "辗转相减移位法 ", 在程序员杂志上有了, 只用到减法和移位等运算,连乘除都不需要.




哦 谢谢哈
[解决办法]
够强
[解决办法]
有趣
[解决办法]
路过
[解决办法]
private String calc(int m, int n)
{
ArrayList num = new ArrayList();
int x = m / n;

m = m % n;
StringBuilder buff = new StringBuilder();
while(m != 0 && !num.Contains(m))
{
num.Add(m);
buff.Append(m * 10 / n);
m = m * 10 % n;
}
if(m != 0)
return x + ".( " + buff.ToString() + ") ";
else
return x + ". " + buff.ToString();
}

[解决办法]
学习
[解决办法]
Mark
------解决方案--------------------


错了,忘记计算从哪位开始循环了

private String calc(int m, int n)
{
ArrayList num = new ArrayList();
int x = m / n;

m = m % n;
StringBuilder buff = new StringBuilder();
while(m != 0 && !num.Contains(m))
{
num.Add(m);
buff.Append(m * 10 / n);
m = m * 10 % n;
}
if(m != 0)
{
int index = num.IndexOf(m);
return x + ". " + buff.ToString().Substring(0, index) + "( " + buff.ToString().Substring(index) + ") ";
}
else
return x + ". " + buff.ToString();
}

[解决办法]
mark

读书人网 >C#

热点推荐