编写简单的约分程序

My_Love 2011-04-20 11:11:54

/* 约分程序
如输入*A=100,*B=60
则输出*A=5,*B=3
*/
void YueFen(unsigned long *A,unsigned long *B)
{


}
...全文
898 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
shun_qizi_ran 2011-04-24
  • 打赏
  • 举报
回复
的确用辗转相除法
swl82560397pq 2011-04-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 my_love 的回复:]
for(int i = 2; i <= a; ++i) //这个效率有点低,能否改进
[/Quote]
应该可以是根号a吧
noteboom 2011-04-24
  • 打赏
  • 举报
回复
楼上的程序有两处小错误,修改为:
经运行无误。


#include<stdio.h>
#include<math.h>

void yuefen(int* ,int*);

main()
{
int a,b,t;

printf("input a b\n");
scanf("%d %d",&a,&b);

if(a>0&&b>0)
{
t=a;
if(a<b)
a=b,b=t;
printf("a=%d b=%d\n",a,b);
yuefen(&a,&b);
printf("a=%d b=%d\n",a,b);

}
}



void yuefen(int *a,int *b)
{
int i;
for(i=2;i<=*b;i++)
if(*b%i==0&&*a%i==0)
{
*a=*a/i,*b=*b/i;
if(*b>1)
yuefen(a,b);
break;
}
}
noteboom 2011-04-24
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<math.h>
void swap(int*,int*);
void yuefen(int* ,int*);
main()
{
int a,b;
printf("input a b\n");
scanf("%d %d",&a,&b);
if(a>0&&b>0)
{
swap(&a,&b);
printf("a=%d b=%d\n",a,b);
yuefen(&a,&b);
printf("a=%d b=%d\n",a,b);

}
}

void swap(int *a,int *b)
{
int t;
t=*a;
if(*a<*b)
*a=*b,*b=t;
}

void yuefen(int *a,int *b)
{
int i;
for(i=2;i<=sqrt(*b);i++)
if(*b%i==0)
{
*a=*a/i,*b=*b/i;
if(*b>1)
yuefen(a,b);
break;
}
}
sunqiyuan1985 2011-04-22
  • 打赏
  • 举报
回复
Euclid算法
xmu_才盛 2011-04-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zhao4zhong1 的回复:]
用辗转相除法求最大公约数
[/Quote]

yes !!!! 这就是公约数 最简单的数学模型,,,

初等数论。。
赵4老师 2011-04-22
  • 打赏
  • 举报
回复
用辗转相除法求最大公约数
zhanghuayi_xiyou 2011-04-22
  • 打赏
  • 举报
回复
补充个对点的
void YueFen(unsigned long *A,unsigned long *B)
{
unsigned long i = 2;
unsigned long c = ((*A) < (*B)) ? (*A):(*B);
if (0 == (*A)%c && 0 == (*B)%c)
{
(*A) = (*A)/c;
(*B) = (*B)/c;
return;
}
while (i <= c)
{
if (0 == (*A)%i && 0 == (*B)%i)
{
(*A) = (*A)/i;
(*B) = (*B)/i;
i--;
c = ((*A) < (*B)) ? (*A):(*B);
}
i++;
}

return;

}
zhanghuayi_xiyou 2011-04-22
  • 打赏
  • 举报
回复

void YueFen(unsigned long *A,unsigned long *B)
{
unsigned long i = 2;
unsigned long c = ((*A) < (*B)) ? (*A):(*B);
if (0 == (*A)%(*C)) && 0 == (*B)%(*C))
{
(*A) = (*A)%(*C);
(*B) = (*B)%(*C);
return;
}
while (i <= c)
{
if (0 == (*A)%i && 0 == (*B)%i)
{
(*A) = (*A)%i;
(*B) = (*B)%i;
i--;
c = ((*A) < (*B)) ? (*A):(*B);
}
i++
}

return;

}
禾刀仲阳 2011-04-22
  • 打赏
  • 举报
回复
找到最大公约数,就行了,十楼的辗转相除法很简单
wangcftxz 2011-04-21
  • 打赏
  • 举报
回复
同意(玄机逸士)
little_angel 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hnuqinhuan 的回复:]
找出最大公约数 然后都除以最大公约数 就可以了 百度很多
[/Quote]


思想很简单,,如果想要效率高点的话,你就再查一下求最大公约数的优化算法
pathuang68 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 my_love 的回复:]

for(int i = 2; i <= a; ++i) //这个效率有点低,能否改进
[/Quote]

那还是先求gcd吧:)

#inclue <stdio.h>
int gcd(int a,int b)
{
if(b) return gcd(b,a%b);
return a;
}

void YueFen(unsigned long *A,unsigned long *B)
{
int temp = 0;
if(*A <= *B)
{
temp = gcd(*A, *B);
}
else
{
temp = gcd(*B, *A);
}
*A /= temp;
*B /= temp;

return;
}

int main(int argc, char* argv[])
{
unsigned long A = 100;
unsigned long B = 60;

printf("Before reduction of fraction:\na = %d, b = %d\n", A, B);

YueFen(&A, &B);

printf("After reduction of fraction:\na = %d, b = %d\n", A, B);
return 0;
}
Qyee 2011-04-20
  • 打赏
  • 举报
回复
int t,r;
if(v>u)
{
t=u;u=v;v=t;
}
while((r=u%v)!=0)
{
u=v;v=r;
}
return(v)
Qyee 2011-04-20
  • 打赏
  • 举报
回复
lz 到百度 找下,最大公约数,有优化版的。哈哈
My_Love 2011-04-20
  • 打赏
  • 举报
回复
for(int i = 2; i <= a; ++i) //这个效率有点低,能否改进
pathuang68 2011-04-20
  • 打赏
  • 举报
回复
原生态c代码,验证通过,供参考:

#include <stdio.h>

/* 约分程序
如输入*A=100,*B=60
则输出*A=5,*B=3
*/
void YueFen(unsigned long *A,unsigned long *B)
{
int a = *A;
int b = *B;

if(a == b)
{
*A = 1;
*B = 1;
return;
}

if(a%b == 0)
{
*A = a/b;
*B = 1;
return;
}

if(b%a == 0)
{
*A = 1;
*B = b/a;
return;
}

if(a > b)
{
for(int i = 2; i <= b; ++i)
{
if((a%i == 0) && (b%i == 0))
{
a = a/i;
b = b/i;
i--;
}
}
}

if(a < b)
{
for(int i = 2; i <= a; ++i)
{
if((a%i == 0) && (b%i == 0))
{
a = a/i;
b = b/i;
i--;
}
}
}

*A = a;
*B = b;
return;
}

int main(int argc, char* argv[])
{
unsigned long a = 100;
unsigned long b = 60;

printf("Before reduction of fraction:\na = %d, b = %d\n", a, b);

YueFen(&a, &b);

printf("After reduction of fraction:\na = %d, b = %d\n", a, b);

return 0;
}
無_1024 2011-04-20
  • 打赏
  • 举报
回复
找出最大公约数 然后都除以最大公约数 就可以了 百度很多
bdmh 2011-04-20
  • 打赏
  • 举报
回复
http://zhidao.baidu.com/question/234549031.html
求出公约数,相除一下就得到了

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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