| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 466 人关注过本帖
标题:请各位高手帮忙看看这个程序有什么问题,运行的时候总出错
只看楼主 加入收藏
hsl3024
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-7-25
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:3 
请各位高手帮忙看看这个程序有什么问题,运行的时候总出错
#include<stdio.h>
void main()
{
    int a,b,c,d,e;
    printf("请输入两个数:");
    scanf("%d,%d",&a,&b);
    if(a<b)
    {e=a;
    a=b;
    b=e;}
    c=a*b;
    while(b!=0)
    {d=a%b;
    a=b;
    b=d;}
    printf("最大公约数是%d\n",b);
    printf("最小公倍数是%f\n",c/b);
}
搜索更多相关主题的帖子: 运行 
2010-07-27 20:37
encounter
Rank: 5Rank: 5
来 自:扬州
等 级:职业侠客
威 望:2
帖 子:150
专家分:359
注 册:2010-7-24
收藏
得分:1 
首先得说这程序明显是错的
做大公约数不是这么求的吧

问题就出在
最小公倍数是%f\n",c/b

unknown software exception
程序需要一块内存用以储存数据时,就需要使用操作系统提供的「功能函数」来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是「动态内存分配」,内存地址也就是编程中的「光标」。内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值「0」已不表示新启用的游标,而是系统向应用程序发出的一个通知,告知出现了错误。




ping   nbtstat   netstat   tracert    nat   at    ftp   telnet..................
2010-07-27 22:03
flyingcat
Rank: 4
来 自:HDU
等 级:业余侠客
威 望:2
帖 子:55
专家分:230
注 册:2010-7-18
收藏
得分:2 
程序代码:
#include<stdio.h>
int _gcd(int,int);
void main()
{
    int a,b,c,d,e;
    printf("请输入两个数:");
    scanf("%d,%d",&a,&b); //这里注意输入格式,你的是%d,%d
    printf("最大公约数是%d\n",_gcd(a,b));  //辗转相除法计算最大公约数,注意你之前的循环,条件是当b==0时才退出循环,也就是说最后
                                               //得到的b一定是0,然后再在下面输出b,就是输出0,然后又去用一个数除以了0,而0做除数是不允许的
    printf("最小公倍数是%d\n",a/_gcd(a,b)*b); //最小公倍数的算法是a*b除以他们的最大公约数,为防止数据溢出,习惯先除再乘,另外此处你使用了%f
                                                   //这也是不对的,因为你的程序中c和b都是整型的,除起来的结果也一定是整型的,所以如果用%f,
                                                   //答案只会得到0.000000
}

int _gcd(int x,int y)    //辗转相除法计算最大公约数
{ 
    int z;
    z = x % y;
    while( z ) 
    {
        x = y;
        y = z;
        z = x % y;
    }
    return y;
} 
2010-07-28 09:56
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:2 
来个详细一点的解释:
输入两个正整数m和n, 求其最大公约数和最小公倍数. <1> 用辗转相除法求最大公约数 算法描述: m对n求余为a, 若a不等于0 则 m <- n, n <- a, 继续求余 否则 n 为最大公约数 <2> 最小公倍数 = 两个数的积 / 最大公约数
#include int main()
{
int m, n; int m_cup, n_cup, res; /*被除数, 除数, 余数*/
printf("Enter two integer:\n");
scanf("%d %d", &m, &n);
if (m > 0 && n >0)
  {
    m_cup = m;
    n_cup = n;
    res = m_cup % n_cup;
    while (res != 0)
     {
       m_cup = n_cup;
       n_cup = res;
       res = m_cup % n_cup;
     }
     printf("Greatest common divisor: %d\n", n_cup);
     printf("Lease common multiple : %d\n", m * n / n_cup);
   }
  else printf("Error!\n");
  return 0;
}
★ 关于辗转相除法, 搜了一下, 在我国古代的《九章算术》中就有记载,现摘录如下: 约分术曰:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。” 其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法,实际上就是辗转相除法。 辗转相除法求最大公约数,是一种比较好的方法,比较快。 对于52317和75569两个数,你能迅速地求出它们的最大公约数吗?一般来说你会找一找公共的使因子,这题可麻烦了,不好找,质因子大。 现在教你用辗转相除法来求最大公约数。 先用较大的75569除以52317,得商1,余数23252,再以52317除以23252,得商2,余数是5813,再用23252做被除数,5813做除数,正好除尽得商数4。这样5813就是75569和52317的最大公约数。你要是用分解使因数的办法,肯定找不到。 那么,这辗转相除法为什么能得到最大公约数呢?下面我就给大伙谈谈。 比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1我们当然也可以把上面这个式子改写成乘法式:a=bq1+r1------l) 如果r1=0,那么b就是a、b的最大公约数3。要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子: b=r1q2+r2-------2) 如果余数r2=0,那么r1就是所求的最大公约数3。为什么呢?因为如果2)式变成了b=r1q2,那么b1r1的公约数就一定是a1b的公约数。这是因为一个数能同时除尽b和r1,那么由l)式,就一定能整除a,从而也是a1b的公约数。 反过来,如果一个数d,能同时整除a1b,那么由1)式,也一定能整除r1,从而也有d是b1r1的公约数。 这样,a和b的公约数与b和r1的公约数完全一样,那么这两对的最大公约数也一定相同。那b1r1的最大公约数,在r1=0时,不就是r1吗?所以a和b的最大公约数也是r1了。 有人会说,那r2不等于0怎么办?那当然是继续往下做,用r1除以r2,……直到余数为零为止。 在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-28 10:02
快速回复:请各位高手帮忙看看这个程序有什么问题,运行的时候总出错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024098 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved