C语言100道基础拔高题(2)

简介: 【7月更文挑战第26天】

1.求两个数的最小公倍数和最大公约数

            解题思路:求最小公倍数可以通过两个数的积再除以最大公约数来计算。而最大公约数则可以通过辗转相除法(又名欧几里得算法)来得到。源代码如下:

include

int main() {
//程序分析:最小公倍数=两个数的积除以最大公约数
//求最大公约数用辗转相除法(又名欧几里得算法)

//首先获取两个数
int a;
int b;
printf("请输入两个数:\n");
scanf("%d %d", &a, &b);
int a1 = a;
int b1 = b;

//求最大公约数,利用辗转相除法
int r = a % b;
while (r != 0) {
    a = b;
    b = r;
    r = a % b;
}
printf("最大公约数为:%d\n", b);

//根据公式求最小公倍数
printf("最小公倍数为:%d\n", (a1 * b1) / b);
return 0;

}

  1. 输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。

             解题思路:通过fgets来读取字符而不使用scanf,就能够将空格的数量也算进来。
    

源代码如下:

include

include //定义头文件,包含对字符串的一些函数

include

int main() {
//输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数
char str[100];
printf("请输入一行字符:\n");
//使用fgets读取字符,只会在遇到换行符等少数情况下才会停止读取,并且其中的stdin表示标准输入流,它告诉fgets从键盘处读取字符并存入到str当中。
// 而使用scanf的时候遇到空格就会停止读取
//值得注意的是,fgets会将换行符也读取到字符串中,可以使用str[strcspn(str, "\n")] = 0来删除换行符
fgets(str, sizeof(str), stdin);
printf("%s", str);

int englishnum = 0;
int spacenum = 0;
int num = 0;
int another = 0;   
for (int i = 0; i < strlen(str); i++) {
    if ('a' <= str[i] && str[i] <= 'z') {
        englishnum++;
    }
    else if(str[i]==' ') {
        spacenum++;
    }
    else if ('0' <= str[i] && str[i] <= '9') {
        num++;
    }
    else {
        another++;
    }
}
printf("这一行字符中英文字符有%d个\n", englishnum);
printf("这一行字符中空格字符有%d个\n", spacenum);
printf("这一行字符中数组字符有%d个\n", num);
printf("这一行字符中其它字符有%d个\n", another);

return 0;

}

  1. 求s=a+aa+aaa+aaaa+aaa...aaa的值,其中a是一个数字,例如2+22+222+2222+22222(此时一共有5个数字相加),而有几个数字相加由键盘控制

             解题思路:接收输入的数字,这个数字可以作为循环的结束条件。通过观察可以知道,从第二个数开始,每一个数都是前面的数乘以10再加上输入的数字得到。源代码如下:
    

include

int main() {
//求s=a+aa+aaa+aaaa+aaaa...aaa的值,其中a是一个数字
//例如2+22+222+2222+22222(此时共有5个数字相加)
//有几个数相加由键盘控制
int num;
printf("请输入一个数:\n");
scanf("%d", &num);
int result = 0;
int number[100];
number[0] = num;
for (int i = 1; i <num; i++) {
number[i] = number[i - 1] * 10 + num;

}

printf("s=");
for (int i = 0; i < num; i++) {
    //printf("%d\n", number[i]);
    if (i == num - 1) {
        printf("%d", number[i]);
    }
    else {
        printf("%d+", number[i]);
    }

}

return 0;

}

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

            解题思路:首先求出输入的数的所有因子,再用一个变量将这些因子全部加起来,判断是否等于原数。源代码如下:

include

int main() {
//如果一个数恰好等于它的因子之和,这个数就称为"完数"
//例如6=1+2+3.请编程找出1000以内的所有完数。
int arr[100] = { 0 };
for (int i = 1; i < 1000; i++) {
int sum = 0;
for (int j = 1; j < i; j++) {
if (i % j == 0) {
sum += j;
}
}
if (sum == i) {
printf("%d\n", i);
}

}

}

  1. 一球从100米高度自由落下,每次落地后反跳回原高度的一半再落下。求它在第10次落地时,共经过多少米?第10次反弹多高?
            解题思路:第一次落地经过100米,从第二次落地开始,经过的距离为前一次落地后反弹高度的两倍。也就是说第二次落地经过的距离为50*2.依次类推,即可求出第十次落地时,一共经过多少米。源代码如下:

include

int main() {
//一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下
//求它在第10次落地时,共经过多少米?第10次反弹多高?
int height = 100;
int distance = height;
for (int i = 2; i <= 10; i++) {

height = height / 2;
distance += height * 2;
}
printf("它在第10次落地时,共经过%d米\n", distance);
printf("第十次反弹%d米",height);
return 0;

}

  1. 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个
    第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
    以后每天早上都吃了前一天剩下的一半零一个
    到第10天早上再想吃的时候,发现只有一个桃子了
    求第一天一共摘了多少。

            解题思路:使用逆向思维,从第十天开始往前推。源代码如下:
    

include

int main() {
//猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个
//第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
//以后每天早上都吃了前一天剩下的一半零一个
//到第10天早上再想吃的时候,发现只有一个桃子了
//求第一天一共摘了多少。
int num = 1;
for (int i = 1; i <= 9; i++) {
num = (num + 1) * 2;
}
printf("第一天一共摘了%d个桃子\n", num);
int num1 = 1534;
for (int i = 1; i <= 9; i++) {
num1 = num1 / 2 - 1;
}
printf("到第十天只剩下%d个桃子", num1);
return 0;
}

7.打印出一个菱形

            解题思路:逐行打印*号,根据需要,每一行打印不同数量的*号。可以使用空格符来使菱形的形状更加像样。源代码如下:

include

int main() {
//打印出一个菱形
for (int i = 1; i <= 4; i++) {
//打印空格,使菱形的形状更加像样
for (int k = 1; k <= 4-i; k++) {
printf(" ");
}
//开始逐行打印数量不相同的
for (int j = 1; j <= 1 + (i - 1)
2; j++) {
printf("*");
}
printf("\n");
}

//开始打印下半部分的*号
for (int i = 1; i <= 3; i++) {
    for (int k = 1; k <=i; k++) {
        printf(" ");
    }

    for (int j = 1; j <= 5 - (i - 1) * 2; j++) {
        printf("*");
    }
    printf("\n");
}

return 0;

}

  1. 有一分数序列:2/1,3/2;5/3;8/5;13/8;21/13...求出这个数列的前20项之和

             解题思路:抓住分子与分母的变化规律。前一个数的分子和分母之和是后一个数的分子。前一个数的分子是后一个数的分母。源代码如下:
    

include

int main() {
//有一分数序列:2/1,3/2;5/3;8/5;13/8;21/13...
//求出这个数列的前20项之和
//程序分析:请抓住分子与分母的变化规律
double a=1;
double b=2;

double result = 0;
for (int i = 1; i <= 20; i++) {
    double sum = a + b;
    result += b / a;        //因为/号得到的结果都是整数,我们要想结果更加精确,就得使用浮点数进行运算
    printf("%lf\n", result);
    a = b;
    b = sum;
}
printf("这个数列的前20项和为:%lf", result);

}

  1. 求1+2!+3!+4!+。。。+20!

             解题思路:每一个数都是前一个数的阶乘再乘以这个数。源代码如下:
    

include

int main() {
//求1+2!+3!+4!+。。。+20!
int sum = 1;
int result = 1;
for (int i = 2; i <= 20; i++) {
sum =sum * i;
result = result + sum;
}
printf("这个运算的结果为:%d", result);

}

  1. 利用递归方法求5!

            解题思路:一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。源代码如下:
    

include

int fun(int num);

int main() {
//利用递归方法求5!
//一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数
int result = fun(5);
printf("!5=%d", result);
return 0;

}

int fun(int num) {
int result = 0;
if (num > 1) {
result = num *fun(num - 1);
}
else if (num == 1) {
result = 1;
}
return result;
}

相关文章
|
存储 C语言 C++
C语言拔高知识——指针的进阶(万字大文超详细)上
C语言拔高知识——指针的进阶(万字大文超详细)
252 0
C语言拔高知识——指针的进阶(万字大文超详细)上
|
存储 C语言
C语言拔高知识——指针的进阶(万字大文超详细)下
C语言拔高知识——指针的进阶(万字大文超详细)
164 0
|
5月前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
291 23
|
4月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
80 1
一文彻底搞清楚C语言的函数
|
5月前
|
算法 C语言
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
本文档介绍了如何编写两个子函数,分别求任意两个整数的最大公约数和最小公倍数。内容涵盖循环控制与跳转语句的使用、最大公约数的求法(包括辗转相除法和更相减损术),以及基于最大公约数求最小公倍数的方法。通过示例代码和测试说明,帮助读者理解和实现相关算法。最终提供了完整的通关代码及测试结果,确保编程任务的成功完成。
246 15
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
|
5月前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
110 24
|
5月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
284 16
|
5月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
144 3
|
5月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
135 2
|
5月前
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
115 1