填空题 2020 省赛
难度:简单
本题我使用了辗转相除法
详见:
解:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int zdgys(int m ,int n);
int sum=0;
for(int i=1;i<=2020;i++){
for(int j=1;j<=2020;j++){
if(zdgys(i,j) == 1){
sum++;
}
}
}
printf("%d",sum);
return 0;
}
int zdgys(int m ,int n)
{
int rem; //余数,当余数为0的时候,最后的m即为最大公约数
//先用较小的数对较大的数取余,再用余数对较小的数求余,直到余数为零
while(n > 0){
rem = m % n;
m = n;
n = rem;
}
return m;
}
优化解:
使用递归
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int zdgys(int m ,int n);
int sum=0;
for(int i=1;i<=2020;i++){
for(int j=1;j<=2020;j++){
if(zdgys(i,j) == 1){
sum++;
}
}
}
printf("%d",sum);
return 0;
}
int zdgys(int m ,int n)
{
if(n == 0 ) return m;
else return zdgys(n,m%n);
}
再优化:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int zdgys(int m ,int n);
int sum=0;
for(int i=1;i<=2020;i++){
for(int j=1;j<=2020;j++){
if(zdgys(i,j) == 1){
sum++;
}
}
}
printf("%d",sum);
return 0;
}
int zdgys(int m ,int n)
{
return n ? zdgys(n, m % n) : m;
}