新华社北京9月7日电 中共中央党史和文献研究院翻译的《习近平关于妇女儿童和妇联工作论述摘编》《习近平关于注重家庭家教家风建设论述摘编》英文版,近日由中...
2025-09-07 0
信息学奥赛(NOIP/CSP 等)中,C 语言是核心编程语言,考察重点是算法逻辑、数据结构应用和代码效率。
以下整理了信奥赛中典型的 C 语言知识点及对应试题(从基础到进阶),涵盖入门到提高组常见内容。
题目描述:输入两个整数,输出它们的和。
知识点:基础输入输出、变量定义。
#include <stdio.h>int main() { int a, b; scanf("%d %d", &a, &b); // 读入两个整数 printf("%d\n", a + b); // 输出和 return 0;}
题目描述:输入一个正整数 n,判断它是否为素数(只能被 1 和自身整除的数,n≥2)。
知识点:循环、条件判断、算术运算符(%取余)。
解题思路:从 2 到√n 遍历,若存在能整除 n 的数,则不是素数。
#include <stdio.h>#include <math.h> // 用于sqrt函数(开平方)int main() { int n, i; scanf("%d", &n); if (n < 2) { // 小于2的数不是素数 printf("不是素数\n"); return 0; } // 从2到sqrt(n)遍历,判断是否有因数 for (i = 2; i <= sqrt(n); i++) { if (n % i == 0) { // 存在因数,不是素数 printf("不是素数\n"); return 0; } } printf("是素数\n"); return 0;}
题目描述:输入一个字符串,输出其反转后的结果(如输入 "abc",输出 "cba")。
知识点:字符串、循环、strlen函数。
解题思路:用两个指针(或下标)分别从字符串首尾向中间移动,交换字符。
代码:
#include <stdio.h>#include <string.h>int main() { char s[100]; scanf("%s", s); // 读入字符串(不含空格) int len = strlen(s); // 获取字符串长度 int i, j; // 交换首尾字符:i从0开始,j从len-1开始 for (i = 0, j = len - 1; i < j; i++, j--) { char temp = s[i]; s[i] = s[j]; s[j] = temp; } printf("%s\n", s); return 0;}
题目描述:输入 n,输出斐波那契数列的第 n 项(数列定义:F (1)=1,F (2)=1,F (n)=F (n-1)+F (n-2))。
知识点:递归、循环(效率优化)。
解题思路:递归实现简洁但效率低(重复计算多),循环实现更高效。
循环版代码(推荐,避免递归栈溢出):
#include <stdio.h>int main() { int n, i; long long f1 = 1, f2 = 1, fn; // 用long long避免大数溢出 scanf("%d", &n); if (n == 1 || n == 2) { printf("1\n"); return 0; } // 循环计算第3到第n项 for (i = 3; i <= n; i++) { fn = f1 + f2; f1 = f2; // 迭代:f1更新为前一项 f2 = fn; // f2更新为当前项 } printf("%lld\n", fn); // %lld对应long long return 0;}
题目描述:输入一个升序排列的整数数组和一个目标值,输出目标值在数组中的下标(若不存在,输出 - 1)。
知识点:数组、二分查找算法(O (logn) 效率)。
解题思路:每次取中间元素与目标值比较,缩小查找范围。
#include <stdio.h>int main() { int arr[10] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}; // 升序数组 int target, left = 0, right = 9, mid; scanf("%d", &target); while (left <= right) { mid = (left + right) / 2; // 中间下标 if (arr[mid] == target) { // 找到目标 printf("下标:%d\n", mid); return 0; } else if (arr[mid] < target) { // 目标在右半部分 left = mid + 1; } else { // 目标在左半部分 right = mid - 1; } } printf("-1\n"); // 未找到 return 0;}
题目描述:输入一个整数数组(可含负数),找出其中和最大的连续子数组(如输入[-2,1,-3,4,-1,2,1,-5,4],输出 6,对应子数组[4,-1,2,1])。
知识点:动态规划、数组遍历。
解题思路:用dp[i]表示以第 i 个元素结尾的最大子数组和,状态转移方程:dp[i] = max(nums[i], dp[i-1] + nums[i])。
#include <stdio.h>#include <stdlib.h> // 用于abs函数int max(int a, int b) { // 自定义max函数(C语言无内置) return a > b ? a : b;}int main() { int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4}; int n = sizeof(nums) / sizeof(nums[0]); // 数组长度 int currentMax = nums[0], globalMax = nums[0]; int i; for (i = 1; i < n; i++) { // 当前最大子数组和:要么自成一段,要么加入前一段 currentMax = max(nums[i], currentMax + nums[i]); // 更新全局最大值 globalMax = max(globalMax, currentMax); } printf("%d\n", globalMax); // 输出6 return 0;}
通过以上知识点和试题练习,可逐步掌握信奥赛 C 语言核心能力,为进阶更高难度的算法(如图论、数论)打下基础。
相关文章
新华社北京9月7日电 中共中央党史和文献研究院翻译的《习近平关于妇女儿童和妇联工作论述摘编》《习近平关于注重家庭家教家风建设论述摘编》英文版,近日由中...
2025-09-07 0
您好:这款游戏可以开挂,确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到-人的牌一样。所以很多小伙伴就怀疑这...
2025-09-07 0
现在人们打棋牌麻将谁不想赢?手机微乐麻将必赢神器但是手机棋牌麻将是这么好赢的吗?在手机上打棋牌麻将想赢,不仅需要运气,也需要技巧。掌握的棋牌麻将技巧就...
2025-09-07 0
“您好,冰美式好了,请扫码取杯。”北京中关村ART PARK大融城内,一座名为“银河太空舱”的装置前,银白色机械臂平稳递出咖啡。排队的人群非但不觉突兀...
2025-09-07 0
近日,苹果计划与谷歌合作,用Gemini为2026年改版的Siri提供支持的消息,引发科技圈震动。一年前还因模型能力不足、发布会翻车被苹果“看不上”的...
2025-09-07 0
走进IFA2025柏林国际展览中心,可能就很难忽略海尔智家。在这个几乎囊括全球消费电子与家电巨头的展会上,海尔智家展区的密度感和热度显得格外突出——不...
2025-09-07 0
前言别急,接下来我们聊一聊,那些正在悄悄改变人类生活可能性的大招技术。别眨眼,这也许是你有生之年能亲身参与的科技奇迹。核聚变:点燃人类能源自由的星辰说...
2025-09-07 0
发表评论