算法题,分数变小数,路过有分

王集鹄 2007-02-28 01:53:14
参与过"一个求和的算法,算法高手请进"
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);
}
...全文
2298 92 打赏 收藏 转发到动态 举报
写回复
用AI写文章
92 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen1990zhi 2011-07-07
  • 打赏
  • 举报
回复
用C语言写的:#include<stdio.h>
#define max 100
int y[max];
int s[max];
int N,D,a,b;

xhj()
{
int i=0,j=1;
s[0]=N/D;y[0]=N%D;
b=0;a=0;
while(y[b]!=0&&j==1&&b<max)
{
b++;
s[b]=(y[b-1]*10)/D;
y[b]=(y[b-1]*10)%D;

for(i=0;i<=b-1;i++)
{
if(y[b]==y[i])
{
a=i+1;
j=0;
break;
}

}
}
}
main()
{
int i;
printf("ENTER N,D:");
scanf("%d %d",&N,&D);
xhj();
printf("%d/%d=",N,D);
if(s[0]!=0) printf("%d",s[0]);
if(b>0) printf(".");
for(i=1;i<=b;i++)
{
if(i==a) printf("(");
printf("%d",s[i]);
}
if(a>0) printf(")");
printf("\n");
}
wu24747873 2010-08-13
  • 打赏
  • 举报
回复
public class fenshu {
public static int N =1000;
int left[]=new int[N];
int dight[]=new int[N];
int q,top,n,d,ii;
fenshu(int n1,int d1){
n=n1;
d=d1;
}
void work(){
while(left[top]!=0){
top++;
left[top]=(left[top-1]*10)%d;
dight[top]=(left[top-1]*10)/d;

for(int i=0;i<top;i++){
if(left[top]==left[i]){
ii=i;
q=top+1;
return;
}
}

}
}
void init(){
left[0]=n%d;
dight[0]=n/d;
top=0;
q=0;
}
void print(){
System.out.print("n/d=");
if(dight[0]!=0){
System.out.print(dight[0]);
}else{
System.out.print(n/d);
}

if(top>0){
System.out.print(".");
if(ii!=0){
for(int i=1;i<=ii;i++){
System.out.print(dight[i]);
}
}
if(q>0){
System.out.print("(");
for(int i=ii+1;i<q;i++)
System.out.print(dight[i]);
System.out.print(")");
}else{
for(int i=1;i<top;i++)
System.out.print(dight[i]);
}
}
}
public static void main(String[] args) {
fenshu fen=new fenshu(1,15);
fen.init();
fen.work();
fen.print();
}
}
xub0117 2007-03-02
  • 打赏
  • 举报
回复
学习
SilenceLeaf 2007-03-02
  • 打赏
  • 举报
回复
圆周率和e既是无理数也是超越数。。。。。。

不要从网上贴来一篇东西就搞得很明白的样子
yuanzh 2007-03-02
  • 打赏
  • 举报
回复
经典贴,虔诚学习!
syeerzy 2007-03-01
  • 打赏
  • 举报
回复
楼上的, 怎么好几个人都说

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

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



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


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

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

我上面已经说过了,这结合后面几位的方法,问题就解决. 现在是优化问题了
SamuelKevin 2007-03-01
  • 打赏
  • 举报
回复
ee365ee() ( ) 信誉:100 Blog 2007-2-28 16:04:39 得分: 0



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

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


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

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



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


------------------------------------这个才是难题啊
王集鹄 2007-03-01
  • 打赏
  • 举报
回复
//1/18=.05(5)应该是:.0(5)
//这个问题已经解决了

private string Calc(int N, int M)
{
string Result = "";
int vMod = N % M;
N = N / M;
if (N > 0)
Result = N.ToString() + ".";
else Result = ".";
List<Point> vList = new List<Point>();
while (vMod > 0)
{
int J = 0;
while (vMod < M)
{
vMod *= 10;
J++;
}
for (; J > 1; J--) Result += "0";
N = vMod / M;
vList.Add(new Point(vMod, Result.Length));
Result += N.ToString();
foreach (Point vPoint in vList)
if (vPoint.X == vMod)
return Result.Insert(vPoint.Y, "(") + ")";
vMod = vMod % M;
}

return Result;
}
daidodo 2007-03-01
  • 打赏
  • 举报
回复
mark
王集鹄 2007-03-01
  • 打赏
  • 举报
回复
ChDw(米)最后给的代码是正确的
王集鹄 2007-03-01
  • 打赏
  • 举报
回复
ChDw(米)的方法也可以,但有bug,没有考虑17/28=0.60(714285)的情况
你得到的结果是:17,28=0.(60714285)

先结了
vbman2003 2007-03-01
  • 打赏
  • 举报
回复
mark
ChDw 2007-03-01
  • 打赏
  • 举报
回复
错了,忘记计算从哪位开始循环了

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();
}
huang_u 2007-03-01
  • 打赏
  • 举报
回复
Mark
huheng_0_0 2007-03-01
  • 打赏
  • 举报
回复
学习
ChDw 2007-03-01
  • 打赏
  • 举报
回复
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();
}
jrl5365 2007-03-01
  • 打赏
  • 举报
回复
路过
duncansun 2007-03-01
  • 打赏
  • 举报
回复
有趣
wolf863292 2007-03-01
  • 打赏
  • 举报
回复
够强
mgh2008 2007-03-01
  • 打赏
  • 举报
回复
学习,接分!
加载更多回复(71)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧