输出
最大公约数 最小公倍数
输入样例
6 15
输出样例
3 30
题解
- 求最大公约数:可用欧几里得算法(也叫辗转相除法)求得,e.g.求1997和615的最大公约数,
1997 ÷ 615 = 3 (余 152)
615 ÷ 152 = 4 (余7)
152 ÷ 7 = 21 (余5)
7 ÷ 5 = 1 (余2)
5 ÷ 2 = 2 (余1)
2 ÷ 1 = 2 (余0),余0则结束,至此,最大公约数为1。
用C语言则为:
while (n != 0)
{
a = n;
n = m % n;
m = a;
}
- 求最小公倍数:在求得最大公约数的情况下,求最小公倍数则比较简单,方法为,两个数的乘积等于这两个数的最大公约数和最小公倍数的乘积,C语言表示为
b = abs(m * n) / gcd(m, n);
代码
#include
#include
#include
int gcd(int m, int n);
int lcm(int m, int n);
int main(int argc, char *argv[])
{
int m, n, a, b;
scanf("%d %d", &m, &n);
a = gcd(m, n);
b = lcm(m, n);
printf("%d %d", a, b);
return 0;
}
int gcd(int m, int n)
{
int a;
if (m < 0 && n < 0)
{
m = -m;
n = -n;
}
if (n == 0)
{
a = 1;
{
else
{
while (n != 0)
{
a = n;
n = m % n;
m = a;
}
return a;
}
}
int lcm(int m, int n)
{
int b;
b = abs(m * n) / gcd(m, n);
return b;
}
id:237 B.欧拉函数
题目描述
在数论中,欧拉函数f(n)被定义为:小于等于n的正整数中和n互质的数的数目(互质即两者最大公约数为1)
如f(1)=1,因为与小于等于1的数中与1互质的数只有1
再如f(8)=4,因为小于等于8中的数与8互质的数有1,3,5,7,而2与8最大公约数为2,4与8最大公约数为4,6与8最大公约数为2
现在给定一个数n,求f(n)的值
要求定义并调用函数f(n),返回欧拉函数的值
输入
测试样例有多组,第一行输入一个整数T,代表测试组数
接下来的每一行输入一个整数n,代表需要计算f(n)的n
输出
对于每组测试样例,各输出一行,其中包括一个整数f(n)
输入样例
3
1
4
8
输出样例
1
2
4
题解
- 测试的样例有多组,表明需要一个在主函数里边需要有一个for循环
- 在自定义的函数里边,需要两重循环for用来遍历,第一重循环用来遍历从1到n的所有数,第二重循环用来检验这个数是否与n互质
- 在第二重循环中,若不为互质,则结束第二重循环,跳到第一重循环进行下一个书的检验,若在第二重循环中没有在中间跳出来,则证明这个循环全部走完,则进行一个if判断,并让计数器加一,返回到主函数中,这个判断语句需要在第一重循环里边完成
代码
#include
#include
int f(int n);
int main(int argc, char *argv[])
{
int T, n, i, result;
scanf("%d", &T);
for (i = 1; i <= T; i++)
{
scanf("%d", &n);
result = f(n);
printf("%d\n", result);
}
return 0;
}
int f(int n)
{
int a, b, c;
c = 0;
for (a = 2; a <= n; a++)
{
for (b = 2; b <= a; b++)
{
if (a % b == 0 && n % b == 0)
{
break;
}
}
if (b > a)
{
c++;
}
}
return c + 1;
}
id:83 C.亲和数(函数)
题目描述
古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
1+2+4+5+10+11+20+22+44+55+110=284。
而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。如果两个数相等,则认为它们不是亲和数。
编写一个函数amicable_number(a,b),该函数判断给定的两个数a b是否是亲和数。
输入
测试次数t
每组测试数据一行,包含两个整数A、B; 其中 0 <= A,B <= 600000 ;
输出
对于每组测试实例,如果A和B是亲和数的话输出YES,否则输出NO。
输入样例
3
220 284
28 28
10000 3000
输出样例
YES
NO
NO
题解
- 因为有测试次数,所以在主函数中要用for循环
- 在自定义函数中,先把其中一个数的约数找出,则也需要一个for循环,遍历从1到A的所有数,在这个循环里,需要嵌套一个if判断语句,判断这个数能否被A整除,若是,则为约数,并用一个变量累加起所有约数
- 当两个数的约数全部都找出并累加后,进行判断,改变判断变量的数的值,传判断变量的值回到主函数,若这个变量的值为1,则输出yes…
代码
#include
#include
int amicable_number(int A, int B);
int main(int argc, char *argv[])
{
int t, A, B, i;
int result = 0;
scanf("%d", &t);
for (i = 1; i <= t; i++)
{
scanf("%d %d", &A, &B);
result = amicable_number(A, B);
if (result == 1)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
int amicable_number(int A, int B)
{
int a, b, c, d, f;
c = 0;
d = 0;
f = 0;
for (a = 1; a < A; a++)
{
if (A % a == 0)
{
c += a;
}
}
for (b = 1; b < B; b++)
{
if (B % b == 0)
{
d += b;
}
}
if (c == B && d == A)
{
f = 1;
}
if (A == B)
{
f = 0;
}
return f;
}
id:389 D.使用函数统计指定数字的个数
题目描述
本题要求实现一个统计整数中指定数字的个数的简单函数:输入两个整数number和digit(0<=digit<=9),统计并输出整数number中数字digit的个数。
要求定义并调用函数countdigit(number,digit),它的功能是统计整数number中数字digit的个数。例如countdigit(10090,0)的返回值是3。
输入
两个整数number和digit(0<=digit<=9)
输出
见样例
输入样例
-21252 2
输出样例
Number of digit 2 in -21252: 3
题解
- 按题目的意思需要将number中的数一个个分解
- 需要在自定义函数中用到while循环
- 当被分解的数和digit相等时,计数器加一,返回计数器的值
- 特殊情况:当number和digit都等于零时,返回一,number为负数时,要将其变为正数
代码
#include
#include
int countdigit(int number, int digit);
int main(int argc, char *argv[])
{
int n, d, result;
scanf("%d %d", &n, &d);
result = countdigit(n, d);
printf("Number of digit %d in %d: %d", d, n, result);
return 0;
}
int countdigit(int number, int digit)
{
int t, a, b;
t = number;
b = 0;
if (t < 0)
{
t = -t;
}
if (t == 0 && digit == 0)
{
return 1;
}
while (t > 0)
{
a = t % 10;
t /= 10;
if (a == digit)
{
b++;
}
}
return b;
}
id:393 E.使用函数求素数和
题目描述
本题要求实现一个判断素数的简单函数、以及利用该函数计算给定区间内素数和的函数。
输入两个正整数m和n(1≤m≤n≤500),求m和n之间的素数和。
素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
要求定义并调用函数prime(p)判断p是否为素数,当p为素数时返回1,否则返回0。定义并调用函数prime_sum(m,n),该函数返回区间[m,n]内所有素数的和。
输入
两个正整数m和n(1≤m≤n≤500)
输出
见样例
输入样例
1 10
输出样例
Sum of ( 2 3 5 7 ) = 17
题解
- 在函数prime(p)中,需要判断这个数是否为素数,若是,则输出一,若不是,则输出0
- 在函数prime_sum(m,n)中,需要用for循环遍历从m到n的所有数,并调用函数prime(p)来判断此数是否为素数,若返回值为一,则将其和求和变量相加,并将求和变量的值返回到主函数中,在此函数中,输出所有素数
- 在主函数中,输入m和n的值并输出sum的值
代码
#include
#include
#include
int prime(int p);
int prime_sum(int m, int n);
int main(int argc, char *argv[])
{
int m, n, sum;
scanf("%d %d", &m, &n);
printf("Sum of (");
sum = prime_sum(m, n);
printf(" ) = %d\n", sum);
return 0;
}
int prime(int p)
{
int i, limit;
if (p == 1)
{
return 0;
}
else if (p == 2)
{
return 1;
}
else
{
limit = sqrt(p) + 1;
for (i = 2; i < limit; i++)
{
if (p % i == 0)
{
return 0;
}
}
return 1;
}
}
int prime_sum(int m, int n)
{
int i, sum;
sum = 0;
for (i = m; i <= n; i++)
{
if (prime(i))
{
printf(" %d", i);
sum += i;
}
}
return sum;
}