函数封装(编程练习)

基本语法

返回类型 函数名(形参类型,形参类型){
	函数体;
}

编程练习

求开方数 res = sqrt(num)

题目再现:
从键盘上输入一个<1000的正数,结果:res = sqrt(num);
如果<0 或者 > 1000 重新输入正数 直到满足区间范围

//封装的函数
double my_sqrt() {
	double num;
	do {
		scanf("%lf", &num);
	} while (num > 1000 || num <= 0);//直到输入的数据正确为止,否则重新输入
	return sqrt(num);
}

int main() {
	double num;
	scanf("%lf", &num);
	方法一
	//while (num <= 0 || num > 1000) {
	//	scanf("%lf", &num);
	//}  
	//方法二:
	while (!(num > 0 && num <= 1000)) { //100
		scanf("%lf", &num);
	}
	double res = sqrt(num);
	printf("%f\n",res); 
	return 0;
}

在这里插入图片描述

求等差数列和 1+2+3+4+5+…+n

int getsum(int n) {  //形式参数列表
	int res = 0;
	for (int i = 1; i <= n; i++) {
		res += i;
	}
	return res;
}

求素数 bool isprimer(int num)


#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
//判断是否为素数
bool isprimer(int num) {
	bool res = true;
	if (num == 2) {
		return true;
	}
	for (int i = 2; i <= sqrt(num); i++) {
		if (num % i == 0) {
			res = false;
			break;
		}
	}
	return res;
}
//测试
int main() { //1~20 哪些是   不是
	for (int n = 1; n <=20 ; n++) {
		bool res = isprimer(n);
		if (res) {
			printf("%d是素数\n", n);
		}
		else {
			printf("%d不是素数\n", n);
		}
	}
}

在这里插入图片描述

求位数 int getbit(int num)

//求位数
int getbit(int num) {
	int bit = 0;
	do {
		num /= 10;
		bit++;
	} while (num != 0);
	return bit;
}
//测试
int main() {
	int count = getbit(1234); //函数调用处  函数名+实参
	printf("%d位数\n",count);
	count = getbit(0); //函数调用处  函数名+实参
	printf("%d位数\n", count);
	count = getbit(-1234); //函数调用处  函数名+实参
	printf("%d位数\n", count);
}

在这里插入图片描述

最大公约数

公因数就是公约数,若干个数它们公共的因数中最大的一个
如6和12的最大公因数是6
6的因数有 1 2 3 6
12的因素有 1 2 3 4 6 12
而他们的公共 因素为 1 2 3 6
最大的因数为 6

// greatest common factor  简称gcf
//1. 用辗转相除法求最大公因数
int gcf_1(int a,int b) {
	int c;
	while (b)
	{
		c = a % b;
		a = b;
		b = c;
	}
	return a;
}

// 2. 用更相减损法求最大公因数
int gcf_2(int a, int b) {
	while (a != b)
	{
		if (a > b)
			a = a - b;
		else
			b = b - a;
	}
	return a;
}

// 3. 穷举法
int gcf_3(int a, int b) {
	int c;
	int max = 1;       //记录最大公约数 
	c = a > b ? b : a;      //c等于a和b中小的数 
	for (int i = 1; i <= c; i++)
	{
		if (a % i == 0 && b % i == 0)
		{
			if (i > max)
				max = i;
		}
	}
	return max;
}

//4. 定义法求最大公因数
//小数%大数  商0余自身    4%9==4
int gcf_4(int a, int b) {
	int j;
	for (j = a;; j--)//求最大公约数
	{
		if (a % j == 0 && b % j == 0)//比如求6  12 的最大公因数  j==6开始和j==12开始都可以  最好用小的开始,即j==6  
			break;//然后直接结束循环即可
	}
	return j;
}
//测试函数
int main() {
	int a = gcf_1(20, 16);
	int b = gcf_2(20, 16);
	int c = gcf_3(20, 16);
	int d = gcf_4(20, 16);
	printf("%d %d %d %d\n", a,b,c,d);
	return 0;
}

在这里插入图片描述

最小公倍数

最小公倍数的定义是能够同时被a和b整除(把a和b整除)的最小正整数
6 的倍数为 6 12 18 24 30 36
12的倍数为 12 24 36 48
他们的公共倍数为 12 36…
所以他们的最小公倍数为12

//least common multiple  简称lcm
int gcf_1(int a,int b) {
	int c;
	while (b)
	{
		c = a % b;
		a = b;
		b = c;
	}
	return a;
}

//1. 定义法,穷举求最小公倍数
int lcm_1(int a, int b) {
	int i;
	for (i = a;; i++)//
	{
		if (i % a == 0 && i % b == 0)//a和b的大小没有关系,最好用大的开始比如6  12   用i==12开始
			break;
	}
	return i;
}

//2. 利用与最大公因数的关系求最小公倍数
int lcm_2(int a, int b) {
	int lcm = (a * b) / gcf_1(a, b);
	return lcm;
}
//测试函数
int main() {
	int a = lcm_1(6, 8);
	int b = lcm_2(6, 8);
	printf("%d %d\n", a,b);
	return 0;
}

在这里插入图片描述

a = 1 n = 3 S = 1+11+111

求S = a+aa+aaa+aaaa+…n部分累加之和,其中a是一个数字,n表示a的个数,例如:2+22+222+2222+22222,此时a为2,n为5。其中 a和n由参数传递。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int getsum(int n, int a) {
	int result = 0; //累加和
	int temp = 0; //每一部分
	//S = 1 + 11 + 111;n=3,a=1
	for (int i = 0; i < n; i++) {
		temp = temp + a;
		result += temp;
		a *= 10; //pow(10,i)
	}
	return result;
}

int main() {
	int a, n;
	scanf("%d%d", &n, &a);
	int res = getsum(n, a);
	printf("%d\n", res);
	return 0;
}

在这里插入图片描述

水仙花数 100~999

输出所有的”水仙花数”,所谓”水仙花数”是指一个3位数.其各位数立方和等于该数本身。例如153是一个水仙花数,因为153 = 各个数三次方之和

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main() {
	for (int num = 100; num < 1000; num++) { //判断一个数是不是水仙花
	//先获取个位,十位,百位  
		int a = num % 10;//3
		int b = num / 10 % 10; // 5
		int c = num / 10 / 10 % 10; //1

		if (num == pow(a, 3) + pow(b, 3) + pow(c, 3)) {
			printf("%d是水仙花数\n", num);
		}
	}
	return 0;
}

函数封装实现

bool getflower(int num) {
	int a = num % 10;//3
	int b = num / 10 % 10; // 5
	int c = num / 10 / 10 % 10; //1
	return num == pow(a, 3) + pow(b, 3) + pow(c, 3);

	/*if (num == pow(a, 3) + pow(b, 3) + pow(c, 3)) {
		return true;
	}
	else {
		return false;
	}*/
}
int main() {
	for (int i = 100; i <= 1000; i++) {
		if (getflower(i)) {
			printf("%d是一个水仙花数\n", i);
		}
	}
	return 0;
}

在这里插入图片描述

完数:6 = 1+2+3

一个数果恰好等于它的因子之和,这个数就称为”完数”。例如,6的因子为1,2,3,而6=1+2+3因此6是”完数”。编程找出1000之内的所有完数。

bool isperfect(int num) {
	int sum = 0;
	for (int i = 1; i < num; i++) {
		if (num % i == 0) {
			sum += i;
		}
	}
	return sum == num;
}

int main() {
	for (int i = 1; i < 1000; i++) {
		if (isperfect(i)) {
			printf("%d是完数\n", i);
		}
	}
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值