鱼C论坛

 找回密码
 立即注册
查看: 1054|回复: 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 编辑
  1. #include<stdio.h>
  2. #define MAX 2020
  3. int gcd(int a, int b);
  4. int main(void)
  5. {
  6.     int i, j, count = 0;
  7.     for (i = 1; i < MAX; i++)
  8.     {
  9.         for (j = i + 1; j <= MAX; j++)
  10.         {
  11.             if (gcd (i,j) == 1)
  12.             {
  13.                 //printf("%d %d\n",i,j);
  14.                 count++;
  15.             }
  16.         }
  17.     }
  18.     printf("一共有%d对最大公约数为1的数\n",count);
  19.     return 0;
  20. }
  21. int gcd(int a, int b)
  22. {
  23.     int m, c;
  24.     //m = a * b;     //求最小公倍数时有用
  25.     c = a % b;
  26.     while (c)
  27.     {
  28.         a = b;
  29.         b = c;
  30.         c = a % b;
  31.     }
  32.     return b;
  33. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-9 21:28:48 | 显示全部楼层
  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int k,count=0,i,j,m,y=1;
  5.         for(i=1;i<=2020;i++)
  6.         {
  7.                 for(j=1;j<=2020;j++)
  8.                 {
  9.                         m=i<j?i:j;    //将i和j里面小的一个赋值给m
  10.                         for(k=m;k>1;k--)
  11.                         {
  12.                                 if((i%k==0)&&(j%k==0))
  13.                                 {
  14.                                           y=k;                       //将i和j的公约数k赋值给y
  15.                                           break; // 再加一个break,跳出循环
  16.                                 }
  17.                                       
  18.                         }
  19.                         if(y==1)          //前面定义了y=1;如果上面的if一次都没有执行,说明i和j在1到m没有公约数,则y肯定为1,则i和j的最大公约数为1,count++
  20.                             count++;
  21.                 }
  22.         }
  23.                 printf("%d",count);
  24.         return 0;
  25. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

不行,还是一样的答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-9 23:09:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jitianmoshen 于 2020-12-9 23:38 编辑
  1. #include<stdio.h>
  2. #define MAX 2020
  3. int gcd(int a, int b);
  4. int main(void)
  5. {
  6.     int i, j, count = 0;
  7.     for (i = 1; i < MAX; i++)
  8.     {
  9.         for (j = i + 1; j <= MAX; j++)
  10.         {
  11.             if (gcd (i,j) == 1)
  12.             {
  13.                 //printf("%d %d\n",i,j);
  14.                 count++;
  15.             }
  16.         }
  17.     }
  18.     printf("一共有%d对最大公约数为1的数\n",count);
  19.     return 0;
  20. }
  21. int gcd(int a, int b)
  22. {
  23.     int m, c;
  24.     //m = a * b;     //求最小公倍数时有用
  25.     c = a % b;
  26.     while (c)
  27.     {
  28.         a = b;
  29.         b = c;
  30.         c = a % b;
  31.     }
  32.     return b;
  33. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的算法,i == 2, j == 3 和 i==3 , j == 2这种情况是不是都重复算了,你的这个算法很慢,上面那个快
  1. #include<stdio.h>
  2. int main()
  3. {
  4.     int k, count = 0, i, j,m;
  5.     for(i = 1;i < 2020; i++)
  6.     {
  7.         for(j = i + 1;j <= 2020; j++)
  8.         {
  9.             //m=i<j?i:j;                 //这句没用, 2和3,3和2是一对啊
  10.             for( k = i;k >= 1;k--)
  11.             {
  12.                 if((i % k == 0)&&(j % k == 0))
  13.                     break;
  14.             }
  15.             if(k == 1)
  16.                 count++;
  17.         }
  18.     }
  19.     printf("%d",count);
  20.     return 0;
  21. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我这个就是这样的,实际上哪个i和j分别是分子和分母。对了,最小公倍数是不是最大公约数?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 2020-12-10 12:31:11 | 显示全部楼层
本帖最后由 jitianmoshen 于 2020-12-10 12:33 编辑
  1. int gcd(int a, int b)      //最大公约数
  2. {
  3.     int c;
  4.     c = a % b;
  5.     while (c)
  6.     {
  7.         a = b;
  8.         b = c;
  9.         c = a % b;
  10.     }
  11.     return b;
  12. }
  13. int lcm(int a, int b)         //最小公倍数
  14. {
  15.     return (a * b) / gcd(a,b);
  16. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

看楼上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-6 11:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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