鱼C论坛

 找回密码
 立即注册
查看: 906|回复: 8

[已解决]算法

[复制链接]
发表于 2020-12-9 20:26:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
int main()
{
        int k,count=0,i,j,m,y=1;
        for(i=1;i<=2020;i++)
        {
                for(j=1;j<=2020;j++)
                {
                        m=i<j?i:j;    将i和j里面小的一个赋值给m
                        for(k=m;k>1;k--)
                        {
                                if((i%k==0)&&(j%k==0))
                                        y=k;                       //将i和j的公约数k赋值给y
                        }
                        if(y==1)          //前面定义了y=1;如果上面的if一次都没有执行,说明i和j在1到m没有公约数,则y肯定为1,则i和j的最大公约数为1,count++
                                count++;
                }
        }
                printf("%d",count);
        return 0;
}



//我这个是求i和j的最大公约数(i和j都是1到2020的数字),如果最大公约数是1,则count++,最后输出最大公约数为1的个数,我看了一下我的算法,感觉没毛病,真的,但是结果就是错的
最佳答案
2020-12-9 23:09:57
本帖最后由 jitianmoshen 于 2020-12-9 23:38 编辑
#include<stdio.h>
#define MAX 2020
int gcd(int a, int b);
int main(void)
{
    int i, j, count = 0;
    for (i = 1; i < MAX; i++)
    {
        for (j = i + 1; j <= MAX; j++)
        {
            if (gcd (i,j) == 1)
            {
                //printf("%d %d\n",i,j);
                count++;
            }
        }
    }
    printf("一共有%d对最大公约数为1的数\n",count);
    return 0;
}
int gcd(int a, int b)
{
    int m, c;
    //m = a * b;     //求最小公倍数时有用
    c = a % b;
    while (c)
    {
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-9 21:28:48 | 显示全部楼层
#include<stdio.h>
int main()
{
        int k,count=0,i,j,m,y=1;
        for(i=1;i<=2020;i++)
        {
                for(j=1;j<=2020;j++)
                {
                        m=i<j?i:j;    //将i和j里面小的一个赋值给m
                        for(k=m;k>1;k--)
                        {
                                if((i%k==0)&&(j%k==0))
                                {
                                          y=k;                       //将i和j的公约数k赋值给y
                                          break; // 再加一个break,跳出循环 
                                }
                                      
                        }
                        if(y==1)          //前面定义了y=1;如果上面的if一次都没有执行,说明i和j在1到m没有公约数,则y肯定为1,则i和j的最大公约数为1,count++
                            count++;
                }
        }
                printf("%d",count);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-9 21:41:45 | 显示全部楼层

不行,还是一样的答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 23:09:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jitianmoshen 于 2020-12-9 23:38 编辑
#include<stdio.h>
#define MAX 2020
int gcd(int a, int b);
int main(void)
{
    int i, j, count = 0;
    for (i = 1; i < MAX; i++)
    {
        for (j = i + 1; j <= MAX; j++)
        {
            if (gcd (i,j) == 1)
            {
                //printf("%d %d\n",i,j);
                count++;
            }
        }
    }
    printf("一共有%d对最大公约数为1的数\n",count);
    return 0;
}
int gcd(int a, int b)
{
    int m, c;
    //m = a * b;     //求最小公倍数时有用
    c = a % b;
    while (c)
    {
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 23:16:54 | 显示全部楼层
本帖最后由 jitianmoshen 于 2020-12-9 23:31 编辑

你的算法,i == 2, j == 3 和 i==3 , j == 2这种情况是不是都重复算了,你的这个算法很慢,上面那个快
#include<stdio.h>
int main()
{
    int k, count = 0, i, j,m;
    for(i = 1;i < 2020; i++)
    {
        for(j = i + 1;j <= 2020; j++)
        {
            //m=i<j?i:j;                 //这句没用, 2和3,3和2是一对啊
            for( k = i;k >= 1;k--)
            {
                if((i % k == 0)&&(j % k == 0))
                    break; 
            }
            if(k == 1) 
                count++;
        }
    }
    printf("%d",count);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 08:30:49 | 显示全部楼层
jitianmoshen 发表于 2020-12-9 23:16
你的算法,i == 2, j == 3 和 i==3 , j == 2这种情况是不是都重复算了,你的这个算法很慢,上面那个快

我这个就是这样的,实际上哪个i和j分别是分子和分母。对了,最小公倍数是不是最大公约数?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-10 08:43:53 | 显示全部楼层

我改了一下,我把for语句里面的j=i+1改成了j=1,就是我要的答案了,说实话,下面哪个求最大公约数我还没有见过,哪个你能在写一个就最小公倍数的算法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 12:31:11 | 显示全部楼层
本帖最后由 jitianmoshen 于 2020-12-10 12:33 编辑
int gcd(int a, int b)      //最大公约数
{
    int c;
    c = a % b;
    while (c)
    {
        a = b;
        b = c;
        c = a % b;
    }
    return b;
}
int lcm(int a, int b)         //最小公倍数
{
    return (a * b) / gcd(a,b);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-10 12:34:47 | 显示全部楼层
严凯 发表于 2020-12-10 08:43
我改了一下,我把for语句里面的j=i+1改成了j=1,就是我要的答案了,说实话,下面哪个求最大公约数我还没 ...

看楼上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 10:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表