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++;}至于为什么你可以思考下。
其实很多代码如果看不懂它,用脑子转是转不过来的,那就用笔写,演算。动手是最好的理解。