目录
基本语法
返回类型 函数名(形参类型,形参类型){
函数体;
}
编程练习
求开方数 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;
}