首页 > 其他分享 >编代码遇到的问题-1

编代码遇到的问题-1

时间:2023-12-08 11:57:18浏览次数:26  
标签:gcd 遇到 int 代码 最大公约数 问题 while 循环 余数

题目是CP1201
第一次代码是

 #include <stdio.h>
 #include <stdlib.h>
 int main()
{
    int a=0,m,n,i;
    scanf("%d,%d",&m,&n);
    if((m+1)%i==0&&(n+1)%i==0&&i<m+1&&i<n+1)
    {
        a=i;
    }
    printf("%d\n",a);
    return 0;
} 

我以为能把符合那四个条件的数赋给变量a,但事实是if意味着只有系统随机给i生成的数满足那四个条件时才会把值赋给a,所以这么写是不对的。
应改为

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a=0,m,n,i;
    scanf("%d%d",&m,&n);
    do
    {
        if(m<=-1||n<=-1)
        {
            printf("Please input again.");
            scanf("%d,%d",&m,&n);//对变量m和n重新读入数据的方式就是再把读入语句写一遍,用新数据覆盖老数据。
        }
    }
    while(m<=-1||n<=-1);
    m+=1;
    n+=1;
    int min=(m<n)?m:n;
    for(i=1;i<=min; i++)
    {
        if(m%i==0&&n%i==0)
        {
            a=i;
        }
    }
    printf("%d\n",a);
    return 0;
}

其中增加了一个对输入的数据必须是正整数的限制,这种限制方法还可以这样

  • 如果只判断一次
#include <stdio.h>

int main()
{
    int m, n;
    printf("请输入m和n的值:");
    if (scanf("%d %d", &m, &n) != 2 || m <= 0 || n <= 0)
    {
        printf("输入的m和n必须是正整数!\n");
    }
    else
    {
        printf("输入的m和n分别是:%d 和 %d\n", m, n);
    }
    return 0;
}

若判断多次知道输入的类型正确为止,要用循环,因为如果仅仅在if语句后的printf("输入的m和n必须是正整数!\n");后加一个scanf("%d %d", &m, &n);,同样只能重输一次,所以要用循环。如下:

#include <stdio.h>

int main() {
    int m, n;
    do {
        printf("请输入m和n的值:");
        if (scanf("%d %d", &m, &n) != 2 || m <= 0 || n <= 0) {
            printf("输入的m和n必须是正整数!\n");
        } else {
            printf("输入的m和n分别是:%d 和 %d\n", m, n);
            break; // 输入符合要求时退出循环
        }
    } while (1); // 一直循环直至输入符合要求
    return 0;
}

要实现当输入的m和n不符合要求时就继续输入直至符合要求为止,你可以使用一个循环来实现这个功能。可以使用do-while循环,这样可以先执行一次输入和判断,然后根据判断结果决定是否继续循环。在这个修改后的代码中,使用了do-while循环来实现当输入的m和n不符合要求时就继续输入直至符合要求为止。

在C语言中,while循环的条件部分需要是一个表达式,只有在表达式的值为真(非零)时才会执行循环体。因此,通常我们会使用一个逻辑表达式作为while循环的条件,例如i < 10或者x != 0等等。
在我之前给出的代码中,我使用了while(1)来表示一个无限循环。这是因为条件部分需要一个逻辑表达式,而1在C语言中被视为真。因此,while(1)表示条件永远为真,因此循环会一直执行下去,直到遇到break语句或者其他方式退出循环。
所以,在这个例子中,while(1)的作用是创建一个无限循环,直到输入的m和n符合要求时才会通过break语句退出循环。

求最大公约数时除了上面的正确代码,还可以把for循环处改为

for(i=min;i>=1; i--)
    {
        if(m%i==0&&n%i==0)
        {
            a=i;
            break;
        }
    }
如果求最小公约数,可改为

for(i=min;i>=1; i--)
{
if(m%i0&&n%i0)
{
a=i;
}
}

for(i=1;i<=min; i++)
{
if(m%i0&&n%i0)
{
a=i;
break;
}
}

如果想求除了1以外的最小公约数,把两种代码里for后的括号里关系表达式里的等号去掉就行了。
且娄老师讲过求两个正整数的最大公约数可以用辗转相除法。
> 辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求两个正整数之最大公约数的算法。它是已知最古老的算法, 其可追溯至公元前300年前。

> 它的具体做法是:用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 

> 另一种求两数的最大公约数的方法是更相减损法。
> 例如:a=25,b=15,a%b=10,b%10=5,10%5=0,最后一个为被除数余数的除数就是5,5就是所求最大公约数。

> 自然语言描述
用辗转相除法确定两个正整数 a 和 b(a≥b) 的最大公因数gcd(a,b):

> 当a mod b=0 时gcd(a,b)=b,否则
gcd(a,b) = gcd(b,a mod b)
递归或循环运算得出结果

> 伪代码
这个算法可以用递归写成如下:
gcd 简易函数
c语言辗转相除代码:
C++语言实现

int gcd(int a, int b)

{

if(b==0) return a;

return gcd(b,a%b);

}

> C语言实现

int gcd(int a,int b)

{

return a%b?gcd(b,a%b):b;

}

所以这道题还可以用辗转相除法做。

标签:gcd,遇到,int,代码,最大公约数,问题,while,循环,余数
From: https://www.cnblogs.com/jfxyh061028/p/17884461.html

相关文章

  • SAP数据一键拉取!利用零代码ETL工具快速实现数据同步
    当我们谈到SAP数据读取以及提取、转换、加载(ETL)工作时,选择适当的方法和工具对于企业来说至关重要。本文将为您介绍如何通过SAP函数读取数据,并推荐一些强大的ETL工具,以帮助您更好地处理和整合SAP数据。如何解锁SAP数据的力量?SAP系统在现代企业中扮演着关键的角色,管理着财务、供......
  • vue中this.$refs的使用方法和遇到的问题
    this.$refs:用于操作真实的DOM节点。 在开发时碰到了一个小需求,需要子组件向父组件传参,而且是不需要通过事件传递的,一开始使用this.$emit()来写的,但是一直没有接受到参数,于是放弃了使用this.$emit()的使用。 于是,使用了在父组件中调用子组件的方法,来获取传递的参数。 一.......
  • matlab安装遇到的问题
    1.找到的资源大部分都是百度网盘,博主没钱,下个16a要下20年了善用搜索找到了阿里云链接的半小时下完了然后课设要给同学发所以需要u盘2.在给移动u盘的时候报错对于目标文件系统过大U盘修改为NTFS格式第一种方法:1、点击【开始】然后找到【运行】,或者是直接使用快捷键WIN+R打......
  • textarea文本居中的问题
    核心:水杯居中用text-align:center;垂直居中用(其中数字30相同就行不一定是30)height:30px;line-height:30px;更多学习,可参考 https://www.python100.com/html/57600.html个人实战案例.myTextArea{border:0pxsolid;overflow:auto......
  • 代码混淆技术探究与工具选择
    引言在软件开发中,保护程序代码的安全性是至关重要的一环。代码混淆(Obfuscatedcode)作为一种常见的保护手段,通过将代码转换成难以理解的形式来提升应用被逆向破解的难度。本文将介绍代码混淆的概念、方法以及常见的代码混淆工具。 正文什么是代码混淆?代码混淆是指将计算机程......
  • 倾斜摄影三维重建遇到常见的问题分析
    倾斜摄影三维重建遇到常见的问题分析 无人机倾斜摄影免像控点三维重建技术已经在许多领域得到广泛应用,包括土地测绘、城市规划、文化遗产保护等。然而,在实际应用中,仍然会遇到一些常见问题和挑战。本文将针对这些问题进行分析,并提供解决方案。1、图像质量不佳:无人机倾斜摄影需......
  • 文件系统Inode使用率 80%——告警问题处理
    1、使用df-i命令查看inode使用情况:df-i这将显示文件系统的inode使用情况,包括已用inode数、可用inode数和inode使用率。2、查找占用inode较多的目录或文件:我得是根文件系统告警find/-xdev-printf'%h\n'|sort|uniq-c|sort-k1-n将 / 替换为要检查的目录......
  • 记录一下工作遇到的一个小bug,DataGrid的DataGridCheckBoxColumn 问题
    <DataTemplatex:Key="CheckBoxDataTemplate"><Grid><CheckBoxClick="CheckBox_Checked"IsChecked="{BindingIsSelect,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"><......
  • VMware17 ubuntu18.04.5安装好后无法访问win11共享文件夹的问题
    1在关闭虚拟机的情况下,点击虚拟机设置,CD/DVD设置使用ISO镜像文件,并设置好镜像路径。2启动虚拟机,此时重新安装VMwaretools按钮变成有效状态,点击该按钮,如果虚拟机进入系统后,该按钮会变成无效状态。3等待虚拟机自动下载VMwaretools,下载后在桌面可以看到VMwaretoolsDVD光盘,......
  • day8、9字符串代码随想录
    第四章字符串●344.反转字符串●541.反转字符串II●卡码网:54.替换数字●151.翻转字符串里的单词●卡码网:55.右旋转字符串1反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。不要给另外的数组分配额外的空间,你必须......