C语言水平测试题 过关斩将(3)辗转相除法,前n项求和,整数的正序分解,求最大公约数

举报
光之梦 发表于 2023/10/18 20:11:53 2023/10/18
【摘要】 我的目标是:用通俗易懂的口语来为大家带来我自己对C语言基础语法的理解,想让零基础小白也能看懂学会并且能够掌握C语言的基础语法

我的个人主页光之梦的博客_云社区-华为云 (huaweicloud.com)

欢迎各位 👍点赞 ⭐收藏 📝评论,如有错误请留言指正,我会第一时间改正。非常感谢!

初学者推荐用的刷题网站蓝桥杯ACM训练系统 - C语言网 (dotcpp.com)

特别标注本博主将会长期更新c语言的语法知识,初学c语言的朋友们,可以收藏订阅一下我的<C语言基础语法>专栏。关注博主,学习不迷路哦


下列是:C语言水平测试题(3)

大家冲鸭!


一、✨前n项求和✨

 输入一个数,求这个数的前n项和


🎇【题型1】 🎇

用户输入一个整数n,请求出这个数从1到n的倒数之和的值,并打印输出

具体要求如下图: 

 代码实现示例:

#include <stdio.h>

int main()
{
	int n; // n用于存储用户输入的值
	int i; // i用于循环计数
	double sum = 0.0; // sum用于存储计算的和的结果
	
    // 用户输入
	printf("请输入您要计算的前n项和的n:");
	scanf("%d",&n);

    // 求前n项和
    // 从1循环递增到n。在每次循环中,1.0/i的值被加到sum中
	for (i = 1; i <= n; i++){
		sum += 1.0/i;
	}
	
    // 输出结果
	printf("f(%d)=%f\n",n,sum);
	return 0;
}

 核心代码块:



🎇【题型2】 🎇

用户输入一个整数n,请计算出从1到n的交替和,并将结果输出

注:其中每一项的正负号会交替改变

 代码实现示例:

#include <stdio.h>

int main()
{
	int n; // n用于存储用户输入的值
	int i; // i用于循环计数
	double sum = 0.0; // sum用于存储计算的和的结果
	int sign = 1; // sign用于标记每一项的正负号,初始值为1 正
	
    // 用户输入
	printf("请输入您要计算的前n项和的n:");
	scanf("%d",&n);

    // 循环计算从1到n的交替和
	for (i = 1; i <= n; i++){
        // sign用于标记正负号,通过乘以sign实现每一项正负号的交替
	    sum += sign*1.0/i;
        // 在每次循环结束时,sign会取反,使下一次循环的正负号相反
        sign = -sign;
	}
	
    // 输出
	printf("f(%d)=%f\n",n,sum);
	return 0;
}

核心代码块:

double sum = 0.0;
int sign = 1;

for (i = 1; i <= n; i++){
		sum += sign*1.0/i;
       sign = -sign;
	}



二、✨求最大公约数✨

需求:

输入两个数 a 和 b,输出它们的最大公约数

输入:1218

输出:6


🎇方案1——枚举🎇        

坏处:效率不高

图例:



🎇方案2——辗转相除法🎇

辗转相除法

  1. 如果 b 等于 0,计算结束,a 就是最大公约数;

  2. 否则,计算 a 除以 b 的余数(a % b),让 a 等于 b,而 b 等于那个余数;

  3. 回到第一步

a b 余数
12 18 12
18 12 6
12 6 0
6 0

代码实现示例:

#include <stdio.h>
//辗转相除法 
int main()
{ 
	//计算a与b的最大公约数 
    // 定义两个变量a和b,用来存储输入的两个整数
	int a,b;

    // 定义一个变量t,用来存储余数
	int t;

	//scanf("%d %d",&a,&b);
	a = 12;b=18;

    // 当b不等于0时,将两个数的差值更新为较小的数与余数的差值
    // 直到余数为0,此时较小的数即为最大公约数
	while (b != 0) {
		t = a % b;
		a = b;
		b = t;
	}
	printf("最大公约数(gcd)=%d\n",a);// 6
	return 0;
}

三、✨正序分解整数✨

正序分解整数

输入一个非负整数,正序输出它的每一位数字输入:13425 输出:1 3 4 2 5

代码实现示例:

#include <stdio.h>

int main()
{
	int x;
	//scanf("%d",&x);
	
	x = 13425;

	int mask = 1;
	int t = x;
	while (t > 9) {
		t /= 10;
		mask *= 10;
	}
	printf("x=%d,mask=%d\n",x,mask);
	do{
		int d = x / mask;
		printf("%d",d);
		if(mask > 9){
			printf(" ");
		}
		x %= mask;
		mask /= 10;
	}while (mask > 0);
	printf("\n");
	return 0;
}





各位学习C语言的初学者,如果有问题随时都可以来问我,我会随时为您解答!欢迎大家与我一起学习,互相进步。

我的C语言专栏:C语言基础语法(超详细)_☆光之梦☆的博客-CSDN博客

创作不易,👍 +⭐ +📝(一键三连) 是对博主最大的鼓励与支持哦。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。