acm水题3个:1.求最大公约数;2.水仙花数;3.判断完数

时间:2022-03-25 23:16:25

//7.求两个整数的最大公约数
#include<stdio.h>
//用穷举法求出最大公约数
int gcd1(int m,int n)
{
int min = m > n ? n : m;
while (min)
{
if (m%min == 0 && n%min == 0)
{
break;
}
else
{
min--;
}
}
return min;
}
//快速求最大公约数的算法,称为辗转相除法,以下用递归实现
int gcd2(int m,int n)
{
if (n==0)
{
return m;
}
return gcd2(n, m%n);
}

int main()
{
int n, m;
while (~scanf("%d%d",&m,&n))
{
//printf("最大公约数为:%d\n", gcd1(m, n));
printf("最大公约数为:%d\n", gcd2(m, n));

}
return 0;
}

//8、“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,/
//比如:153=1^3+5^3+3^3,输入一个整数,判断它是否是水仙花数。
#include<stdio.h>
int cube(int a)
{
return a*a*a;
}
int main()
{
int n;
int temp;
int g;//个位
int s;//十位
int b;//百位
int num[4];
int sum;
while (~scanf("%d",&n))
{
//temp用来记录原来的n,因为后面n会被改掉
temp = n;
sum = 0;//sum用来记录各数的立方和
for (int i = 0; i < 3; i++)
{
num[i] = n % 10;
sum += cube(num[i]);
n /= 10;
}
if (sum==temp)
{
printf("此三位数是水仙花数\n");
}
else
{
printf("此三位数不是水仙花数\n");
}
/*g = n % 10;
n /= 10;
s = n % 10;
n /= 10;
b = n % 10;
if (temp == (cube(g) + cube(s) + cube(b)))
{
printf("此三位数是水仙花数\n");
}
else
{
printf("此三位数不是水仙花数\n");
}*/
}
return 0;
}

//9、完数的定义:如果一个大于1的正整数的所有因子之和等于它的本身,
//则称这个数是完数,比如6,28都是完数:6=1+2+3;28=1+2+4+7+14。输入一个整数,判断它是否是完数。
#include<stdio.h>
int main()
{
int n;
int temp;//用来记录所有因子之和
while (~scanf("%d",&n))
{
temp = 0;//每次一次都要初始化一次
for (int i = 1; i <= n / 2; i++)
{
if (n%i==0)
{
temp += i;
}
}
if (temp==n)
{
printf("此数是完数\n");
}
else
{
printf("此数不是完数\n");
}
}
return 0;
}

参考博客:http://blog.csdn.net/hackbuteer1/article/details/6667026