C语言-第十一周做题总结-函数1

id:171 A.公约公倍

题目描述

写两个函数,分别求两个正整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数m和n(0<m,n≤1000)由键盘输入。

要求定义和调用函数gcd(m,n)计算m和n的最大公约数,定义和调用函数lcm(m,n)计算m和n的最小公倍数

输入

两个正整数m和n(0<m,n≤1000)

输出

最大公约数 最小公倍数

输入样例

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 <stdio.h>
#include <stdlib.h>
#include <math.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
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 <stdio.h>
#include <stdlib.h>
#include <math.h>
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;
}
  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值