vincenths 发表于 2012-2-7 11:51:59

求公约数的题 你能看出错在哪里吗???

include<stdio.h>
int CommonFactors(int a,int b)
{
int r;
if(a<0||b<0)
return -1;
for(r=a;r>0;r--)
{
if(a%r==0 && b%r==0)
return r;
}
}
main()
{
int sub;
while((sub=CommonFactors(100,50)>0))
{
static int counter=1;
printf("common factor %d is %d\n",counter++,sub);
}
}

仰望天上的光 发表于 2012-2-7 11:52:00

#include<stdio.h>
int CommonFactors(int a,int b)
{
        static int r = 0;
        if(a<0||b<0) return -1;
        do{
                ++r;
                if(a%r==0 && b%r==0) return r;
        }while( r<=a );
}
main()
{
        int sub;
        while((sub=CommonFactors(100,50))>0)
        {
                static int counter=1;
                printf("common factor %d is %d\n",counter++,sub);
        }
}

Cabernet 发表于 2012-2-7 14:27:20

逻辑太混乱了,首先你子函数里的if语句后面需要一个else,不然都输出后面for语句无论如何都会执行的。

看看我根据你的算法改写的:
#include <stdio.h>

void commonFactors(int bigNum,int smallNum) //不设置返回值,直接在子函数里打印
{
        int k,i=0;   //变量k用来置换两个参数和控制循环,i作为计数,统计公约数的个数
        if (bigNum < 0 || smallNum < 0)
                printf(" 参数错误!");//打印错误信息
        else
       if (bigNum < smallNum)//如果前面的数小,则置换下
       {       
                k = smallNum;
                smallNum = bigNum;
                bigNum = k;
       }       
        for (k = smallNum;k>0;k--)
        {
                if (smallNum % k == 0 && bigNum % k ==0)
                {       
                        i++;
                        printf("Common factor %d is %d. \n", i, k);
                }
        }

       

}

int main()
{
        commonFactors(100,50);       

        return 0;
}

该程序在ubuntu下gcc编译通过。

wangyexin 发表于 2012-2-7 16:18:51

你的函数只能返回最大公约数

vincenths 发表于 2012-2-7 20:02:25

仰望天上的光 发表于 2012-2-7 12:45 static/image/common/back.gif


:handshake 谢谢你 呵呵 

vincenths 发表于 2012-2-7 20:09:35

仰望天上的光 发表于 2012-2-7 12:45 static/image/common/back.gif


可是如果是要第一次调用 返回最大公约数 以后只要再使用相同参数调用 每次返回下一个小一些的公约数 那怎么改呢{:1_1:}

vincenths 发表于 2012-2-7 20:18:38

Cabernet 发表于 2012-2-7 14:27 static/image/common/back.gif
逻辑太混乱了,首先你子函数里的if语句后面需要一个else,不然都输出后面for语句无论如何都会执行的。

看 ...

亲 不能改动主函数哦 再试试{:1_1:}

仰望天上的光 发表于 2012-2-7 21:32:00

#include<stdio.h>
int CommonFactors(int a,int b)
{
      static int r = 0;
      if(a<0||b<0||(a-r==1)) return -1;
      do{
                ++r;
                if(a%(a-r)==0 && b%(a-r)==0) return a-r;
      }while( r<a-1 );
}
main()
{
      int sub;
      while((sub=CommonFactors(100,50))>0)
      {
                static int counter=1;
                printf("common factor %d is %d\n",counter++,sub);
      }
}

vincenths 发表于 2012-2-13 21:28:34

仰望天上的光 发表于 2012-2-7 21:32 static/image/common/back.gif


:hug:   谢谢……

Simanzen 发表于 2014-2-27 02:06:45

lz要注意编程的书写规范喔

immortalfaith 发表于 2016-9-11 17:07:37

来站坐
页: [1]
查看完整版本: 求公约数的题 你能看出错在哪里吗???