作业抓捕局

2022.11.22--判断两个整数m和n是否互质(即是否有公共的因子)(m≠1,n≠1)。方法是: 用2到t(t取m和n中较小的那个数)之间的数分别去除m和n,若m和n能同时被某个数除尽,则m和n不互质;否则它们互质。

    例如,若输入187和85,则应输出No(表示它们不互质,它们有公因子17)。若输入89和187,则应输出Yes(表示它们互质)。

#include<stdio.h>
int main()
{
    int i,j,m,n;
    scanf("%d%d",&m,&n);
    if(m>n)
    {

        for( i=2; i<=n; i++)
            if(m%i==0&&n%i==0)
            {
                printf("No");
                break;
            }

        if(i>n)printf("Yes");
    }
    if(m<=n)
    {

        for( j=2; j<=m; j++)
            if(m%j==0&&n%j==0)
            {
                printf("No");
                break;
            }

        if(m>j)printf("Yes");
    }
    return 0;

}

总结一下错误:1.   if(m%j==0&&n%j==0)刚开始写这个的时候直接是n%j==m%j,也没多想,之后一直的不出结果,才发现虽然他们可能拥有相同的因子,但得到的商不一定相同。

2. if(i>n)printf("Yes");刚开始下意识地写成了if(i==n)注意:我之前一直喜欢犯得一个错误就是把括号里的i等于写成了i=n。这是赋值,而不是等于。其实我们仔细看条件就可以发现,这里是不可以等于的,因为万一在最后一个数他们有了个共同因子呢?其实这个条件的原理是这样的:如果在循环里即在循环限制的范围内j<=m范围内就有共同因子的话就会被中途打断,从而使j的值就不是在这里面,如果它在这个范围都没有共同因子从而就会循环到最后,最后j出来的值就是j+1让j>m所以就输出Yes

3.最后一个错误就是没有把 if(m>j)printf("Yes");这个条件放在if(m<=n)这个语句中,因为如果不放进来你会发现打出来两个Yes,而我们这里是在大条件基础上进行小条件的,而不是单独语句。

---------------------------------------------------------------------------------------------------------------------------------

编写函数fun(int n),它的功能是:计算正整数n的所有因子(1和n除外)之和作为函数值返回。例如:n=120时,函数值为239。

#include<stdio.h>

int fun(int n)

{

    int k,m,sum=0;

    for(int i=2;i<=n/i;i++)

    {

        if(n%i==0)

        {

            k=i;

            m=n/i;

            sum=sum+m+k;

        }

    }

    return sum;

}

int main()

{

    int x;

    scanf("%d",&x);

    printf("%d",fun(x));

    return 0;

}

​这里提醒一下:总是用  sum=sum+m+k这种东西时总是忘记了先把sum赋值为零,不然它就会刚开始附随机值。

---------------------------------------------------------------------------------------------------------------------------------将一个整数中的每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为:想先来解释一下为什么是减这个‘0’时,t中的数为:7531。

#include<stdio.h>
int main()
{
    char s[100];
    gets(s);
     int sum=0,num=0;
    char t[100];
    for(int i=0;i<strlen(s);i++)
    {
        if((s[i]-'0')%2!=0){t[num]=s[i]-'0';num++;}
        else continue;

    }

    for(int i=0;i<num;i++)
        {
            printf("%d",t[i]);
        }
    return 0;
}

这个是我这几个题里面做得最久的题,我想了好久,最后把自己的问题逐个总结:1.先来解释一下为什么是减‘0’,这是由于我们现在弄的数组是字符所表示的数字也是字符形式,而要把它转化为数字就要减去零的字符,其实也就是说每个字符都有它的ASCII值,数字也是,我们这里减的‘0’就相当于减了数值零的ASCII表对应的值也就是48,当然你也可以直接减四十八,减完后他就变为了数值就可以运算了,其实之前的数字字符也是可以运算的用其对应的ASCII值,但是并不是数值本身的值。所以我们这里的操作就是要把数字字符转换为数字的值。当然,我们这里除了上面显示的代码外,你也可以最终输出数字字符,但是相应的要变为    printf("%c",t[i]);    if((s[i]-'0')%2!=0){t[num]=s[i];num++;}至于为什么你可以思考下。

其实很多代码如果看不懂它,用脑子转是转不过来的,那就用笔写,演算。动手是最好的理解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值