C语言经典题目及解题思路

合集下载

c语言面试中常问的算法题目

c语言面试中常问的算法题目

c语言面试中常问的算法题目
在 C 语言面试中,常常会涉及一些算法题目,以下是一些常见
的算法题目及其解答:
1. 反转字符串:
题目,给定一个字符串,将其反转。

解答,可以使用两个指针,一个指向字符串的起始位置,另
一个指向字符串的末尾位置,然后交换两个指针所指向的字符,然
后两个指针向中间移动,重复这个过程直到两个指针相遇。

2. 判断字符串是否为回文串:
题目,给定一个字符串,判断它是否是回文串(正读和反读
都相同)。

解答,可以使用两个指针,一个指向字符串的起始位置,另
一个指向字符串的末尾位置,然后逐个比较两个指针所指向的字符,如果不相等则不是回文串。

3. 查找数组中的最大值和最小值:
题目,给定一个整数数组,找出数组中的最大值和最小值。

解答,可以使用两个变量分别保存当前的最大值和最小值,然后遍历数组,逐个比较并更新最大值和最小值。

4. 实现快速排序算法:
题目,给定一个整数数组,使用快速排序算法对数组进行排序。

解答,快速排序算法的基本思想是选择一个基准元素,将数组分为两部分,一部分小于基准元素,一部分大于基准元素,然后递归地对两部分进行排序。

5. 判断一个数是否为素数:
题目,给定一个整数,判断它是否为素数(只能被 1 和自身整除)。

解答,可以使用循环遍历从 2 到该数的平方根,逐个判断是否能整除该数,如果能整除则不是素数。

以上是一些常见的在 C 语言面试中经常被问到的算法题目及其解答。

当然,还有很多其他的算法题目,希望这些题目能帮助您更好地准备面试。

C语言编程题带答案

C语言编程题带答案

C语言编程题带答案C 语言作为一门广泛应用的编程语言,在学习过程中,通过编程题的练习可以更好地掌握其语法和逻辑。

下面为您带来几道 C 语言编程题以及详细的答案解析。

题目一:求两个整数的和要求编写一个 C 语言程序,输入两个整数,计算并输出它们的和。

```cinclude <stdioh>int main(){int num1, num2, sum;printf("请输入第一个整数:");scanf("%d",&num1);printf("请输入第二个整数:");scanf("%d",&num2);sum = num1 + num2;printf("这两个整数的和是:%d\n", sum);return 0;```解析:在这个程序中,首先使用`printf`函数提示用户输入两个整数,然后通过`scanf`函数获取用户输入的值并存储在变量`num1`和`num2`中。

接下来,将这两个数相加并将结果存储在变量`sum`中,最后使用`printf`函数输出结果。

题目二:判断一个数是否为奇数编写一个 C 语言程序,输入一个整数,判断它是否为奇数,如果是奇数输出“是奇数”,否则输出“不是奇数”。

```cinclude <stdioh>int main(){int num;printf("请输入一个整数:");scanf("%d",&num);if (num % 2!= 0) {printf("是奇数\n");} else {printf("不是奇数\n");return 0;}```解析:在这个程序中,使用取余运算符`%`来判断一个数是否能被2 整除。

如果取余结果不为 0,说明该数不能被 2 整除,即为奇数;否则,不是奇数。

题目三:计算 1 到 100 的累加和编写一个 C 语言程序,计算 1 到 100 的累加和。

```cinclude <stdioh>int main(){int sum = 0, i;for (i = 1; i <= 100; i++){sum += i;}printf("1 到 100 的累加和是:%d\n", sum);return 0;```解析:这里使用了`for`循环从 1 迭代到 100,每次迭代都将当前的数字加到变量`sum`中,最终得到 1 到 100 的累加和。

c语言枚举法例题及解题思路

c语言枚举法例题及解题思路

c语言枚举法例题及解题思路一、引言枚举法是一种常用的编程方法,通过列举所有可能的选项,逐一进行判断或计算,从而解决特定的问题。

在C语言中,枚举法尤其适用于需要处理大量数据或进行有限次试验的情况。

本文档将通过几个例题来展示如何使用枚举法进行解题,并提供详细的解题思路。

二、例题及解题思路1. 例题1:求水仙花数水仙花数是指一个n位数(n≥3),其各个位上的数字的n次幂之和等于它本身。

例如,153是一个3位数,且各个位上的数字的3次幂之和等于153(1^3 + 5^3 + 3^3 = 153),因此153是一个水仙花数。

解题思路:* 枚举所有可能的n位数;* 逐一判断该数的各个位上的数字的n次幂之和是否等于该数;* 如果是,则该数为水仙花数,输出该数。

代码实现:```c#include <stdio.h>int main() {int n, num, originalNum = 0;for (n = 3; n >= 0; n--) { // 从3位数开始枚举num = 0;for (int i = 0; i < n; i++) { // 逐位判断num = num * 10 + (rand() % 10); // 生成随机数}num = num * n; // 计算n次幂之和if (num == originalNum) { // 判断是否相等printf("%d是水仙花数\n", num);} else { // 如果不相等,继续下一轮枚举continue;}}return 0;}```2. 例题2:求斐波那契数列前n项和斐波那契数列是一个经典的数学序列,前两项为0和1,之后的每一项都是前两项之和。

例如,斐波那契数列的前几项为:0、1、1、2、3、5、8、13、21...求斐波那契数列前n项的和。

解题思路:* 使用枚举法逐一判断前n项中的每一项;* 根据斐波那契数列的定义,计算每一项的值;* 将所有项的值相加得到总和。

c语言期末考试题库大题及详解答案

c语言期末考试题库大题及详解答案

c语言期末考试题库大题及详解答案C语言期末考试题库大题及详解答案一、简答题1. 请简述C语言的基本数据类型及其特点。

答案:C语言的基本数据类型包括整型(int)、浮点型(float和double)、字符型(char)和枚举型(enum)。

整型用于存储整数,浮点型用于存储小数,字符型用于存储单个字符,枚举型用于定义一组命名的常量。

每种数据类型都有其特定的取值范围和占用内存大小。

2. 请解释C语言中的数组和指针的区别。

答案:数组是一种数据结构,用于存储固定数量的相同类型元素,可以通过下标访问元素。

指针是一个变量,它存储另一个变量的内存地址。

数组名可以作为指向数组第一个元素的指针使用,但数组本身是一个固定大小的内存块,而指针可以被赋值为不同的地址,具有动态性。

二、编程题1. 编写一个C语言程序,实现输入三个整数,找出其中的最大值并输出。

答案:```c#include <stdio.h>int main() {int num1, num2, num3, max;printf("请输入三个整数:");scanf("%d %d %d", &num1, &num2, &num3);max = (num1 > num2) ? ((num1 > num3) ? num1 : num3) : ((num2 > num3) ? num2 : num3);printf("最大值是:%d\n", max);return 0;}```2. 编写一个C语言程序,实现字符串的反转。

答案:```c#include <stdio.h>#include <string.h>int main() {char str[100];printf("请输入一个字符串:");fgets(str, sizeof(str), stdin); // 使用fgets以包含空格int len = strlen(str) - 1; // 减去换行符长度for (int i = len; i >= 0; --i) {printf("%c", str[i]);}printf("\n");return 0;}```三、综合题1. 请编写一个C语言程序,实现一个简单的计算器,能够进行加、减、乘、除四种基本运算。

C语言编程实例100题(带解析适合新手超经典)

C语言编程实例100题(带解析适合新手超经典)

C语言程序实例100个(一)【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。

组成所有的排列后再去掉不满足条件的排列。

2.程序源代码:main(){int i,j,k;printf("\n");for(i=1;i<5;i++)/*以下为三重循环*/ for(j=1;j<5;j++)for (k=1;k<5;k++){if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k);}}==============================================================【程序2】题目:企业发放的奖金根据利润提成。

利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?1.程序分析:请利用数轴来分界,定位。

注意定义时需把奖金定义成长整型。

2.程序源代码:main(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}==============================================================【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。

C语言题目

C语言题目
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。所有输出的最后一行不能有回车
样式输入:
500 3
150 300
100 200
470 471
样式输出:
298
题目标题:
统计(左利芳)
题目描述:
统计个位数为6的n位数,且能被m整除的共有多少个?
3、建立两层嵌套循环,外循环至退出人数为n-1为止,
内循环中从0循环至n,将a数组中非0的数据逢m置零,同时记录退出人数;
4、循环全部结束后输出最后留下的一个a数组的非零元素的值。
输入描述:
输入为两个正整数,第一个<=100,第二个<=9;
输出描述描述:
输出为一个正整数;
特殊情况,闰年且输入月份大于3时需考虑多加一天。
输入描述:
输入为三个整数,分别表示年、月、日;
输出描述描述:
输出为一个整数,表示输入的年月日为当年的第几天;
样式输入:
2010 1 1
样式输出:
1
题目标题:
电子钟模拟显示(谌海军)
题目描述:
题目描述:
有一个字符串,包括n个字符。写一个函数,将此字符串从第m个字符开始的全部字符复制成另一个字符串。
要求在主函数输入字符串及m值并输出复制结果。
(知识点:控制语句、字符串、指针)
输入描述:
输入为一个字符串(长度小于80)及一个整形数(小于字符串的实际长度)
输出描述描述:
输出为一个字符串
样式输入:
abcdefghijklmnopqrst
8
样式输出:
hijklmnopqrst

大一c语言经典编程题

大一c语言经典编程题
在大一学习C语言时,经典的编程题有很多,下面我将为你列
举几个常见的题目,并从不同角度给出解答。

1. 计算两个整数的和与积。

题目描述,编写一个程序,要求用户输入两个整数,然后计算
并输出它们的和与积。

解答,可以使用scanf函数接收用户输入的两个整数,然后使
用加法和乘法运算符计算和与积,最后使用printf函数输出结果。

2. 判断一个数是否为素数。

题目描述,编写一个程序,判断用户输入的一个正整数是否为
素数。

解答,可以使用循环从2开始逐个除以该数的所有可能因子,
如果存在能整除该数的因子,则该数不是素数;否则,该数是素数。

3. 求解斐波那契数列。

题目描述,编写一个程序,输出斐波那契数列的前n项。

解答,可以使用循环或递归的方式实现斐波那契数列的求解。

循环方式通过迭代计算当前项和前两项的和,递归方式则通过定义函数自身来求解。

4. 字符串反转。

题目描述,编写一个程序,将用户输入的字符串进行反转。

解答,可以使用循环遍历字符串,将字符从后往前逐个取出,并放入一个新的字符串中,最后输出新的字符串即可实现字符串反转。

5. 数组排序。

题目描述,编写一个程序,对一个整型数组进行升序排序。

解答,可以使用冒泡排序、选择排序、插入排序等常见的排序算法来对整型数组进行升序排序,具体实现方式可以根据具体算法
进行编写。

以上只是一些大一阶段常见的C语言编程题,还有很多其他的经典题目,可以通过参考相关的编程教材或网上资源来获取更多题目和解答。

希望以上回答能够帮助到你。

C语言经典题目及解题思路


【思路】1~9组成的最小三位数是123,最大的是987,由于要满足1:2:3的关系,最小的那个数应该不到于987/3=329。这样的话第一个数的变化范围是123~329,将这里面的数分别乘2、乘3,然后判断这三个数是否符合要求,即这三个数是否由1~9组成,而且各个数字不能相同。
即对每个数n(123<=n<=329)用枚举法。
for(j=1;j<=n;j++)
{
sum+=(int)(pow(temp%10,n));
temp=temp/10;
}
if(m==sum)/*if m is equal to sum,that is to say m is a Armstrong integer*/
上楼可以一步上一阶,也可以一步上二阶,当上一阶时问题规模变为N-1,当上二阶时问题规模变为N-2,所以总的情况为count(n-1)+count(n-2)。
【代码】
cCODE:
#include<stdio.h>
#include<stdlib.h>
int count(int n);
{//用于判断整数n的各位数字是否相同,如果有想同的就返回0;否则返回1
int num[10],i,j,len=0,temp=n;
do
{
++len;
temp=temp/10;
}while(temp);//求出n的位数
for(i=1;i<=len;i++)
定义函数int judgeDigit(int m),用于判断给定参数m的位数;
定义函数int judgeEqual(int m,int n),其中m为给定的数,n为m的位数,用于判断m是否等于各位数的n次方之和。

c语言经典编程试题12例(带答案)

{
int i,num=0;
float a[10],sum=0.0;
printf("请输入10个数\n");
for(i=0;i<10;i++)
scanf("%f",&a[i]);
for(i=0;i<10;i++)
if(i>=0)
{
num++;
sum+=a[i];
}
printf("10个数中非负数的个数为:%d\n",num);
void main()
{
char a[50];
char *p,*q;
printf("请输入一个字符串:");
gets(a);
for(p=a;*p!=0;)
if(*p=='a')
{
q=p;
while(*p)
{
*p=*(p+1);
p++;
}
p=q;
}
else
p++;
printf("%s\n",a);
}
12、一个皮球从100米的高度自由落下,每次落地后反弹回原来高度的一半,再落下,在反弹。求当它第10次落地时,共经过了多少米,第十次反弹多高?
printf("100之内偶数的和位: %d\n",sum);
}
7、求1*2*3+3*4*5+…99*100*101的值。
解题思路:
定义一个变量从1到101,再有标志变量j确定乘够3个数之后便重新开始下一次乘积。跳出循环后加上最后一次乘积。

c语言期末考试题库大题及详解答案

c语言期末考试题库大题及详解答案1. 题目:编写一个C语言程序,实现一个简单的学生成绩管理系统,要求能够添加学生信息、查询学生信息、修改学生信息和删除学生信息。

答案:```c#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct {int id;char name[50];float score;} Student;Student students[100];int studentCount = 0;void addStudent(int id, char* name, float score) {if (studentCount < 100) {students[studentCount].id = id;strcpy(students[studentCount].name, name);students[studentCount].score = score;studentCount++;} else {printf("学生信息已满。

\n");}}void queryStudent(int id) {for (int i = 0; i < studentCount; i++) {if (students[i].id == id) {printf("学生ID:%d, 姓名:%s, 成绩:%.2f\n", students[i].id, students[i].name, students[i].score);return;}}printf("未找到该学生信息。

\n");}void modifyStudent(int id, char* name, float score) {for (int i = 0; i < studentCount; i++) {if (students[i].id == id) {strcpy(students[i].name, name);students[i].score = score;printf("学生信息已更新。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言经典题目及解题思路本来是想写个《C语言经典题目系列》,本系列包括一些经典算法题目,但由于时间问题,现在只是收集了不多题目且只做了一部分,就先发上来了。

写此目的帮助一些学c语言的人入门及运用一些算法,由于水平有限错误在所难免及本来这些题目不是很难高手就不用看了,其中错误欢迎大家指正。

1、【问题描述】梯有N阶,上楼可以一步上一阶,也可以一步上二阶。

编写一个程序,计算共有多少中不同的走法【思路】看到此题目容易想到用递归的方法来做,因为递归是一种描述和解决结构自相似问题的基本算法,而N阶楼梯问题和N-1阶、N-2阶的结构完全相同。

解决递归问题可以分为两个部分,第一部分是一些特殊(基础)情况,用直接法解,即始基;第二部分与原问题相似,可用类似的方法解决(即递归),但比原问题的规模要小。

定义int count(int n)函数求解N阶楼梯的走法,基于上述思想,可知:[list][*]N阶楼梯问题的始基是N==1、N==2两种情况;[*]上楼可以一步上一阶,也可以一步上二阶,当上一阶时问题规模变为N-1,当上二阶时问题规模变为N-2,所以总的情况为count(n-1)+count(n-2)。

[/list]【代码】[table=98%][tr][td]cCODE:[/td][/tr][tr][td]#include<stdio.h>#include<stdlib.h>int count(int n);/*count how many ways to climb up N steps stairs.*/int main (int argc, char *argv[]){int n,ct;printf("please input n:\n");scanf("%d",&n);ct=count(n);printf("there are %d ways to climb up N steps stairs!\n",ct);system("PAUSE");return 0;}int count(int n){if(1==n)return 1;else if(2==n)return 2;else return count(n-1)+count(n-2);}[/td][/tr][/table]【程序输入输出】for exampleplease input n:5there are 8 ways to climb up N steps stairs!2、【问题描述】Armstrong数具有如下特征:一个n位数等于其个位数的n次方之和。

如:153=13+53+331634=14+64+34+44找出2、3、4、5位的所有Armstrong数。

【思路】看到此题我第一反应是用枚举法,给定m(10<=m<=99999),首先判断m的位数n,然后判断它是否等于各位数的n次方之和。

[list][*]定义函数int judgeDigit(int m),用于判断给定参数m的位数;[*]定义函数int judgeEqual(int m,int n),其中m为给定的数,n为m的位数,用于判断m是否等于各位数的n次方之和。

[/list]【代码】[table=98%][tr][td]cCODE:[/td][/tr][tr][td]#include<stdio.h>#include<stdlib.h>#include<math.h>int judgeDigit(int m);/*This function return the digit of parameter m*/void judgeEqual(int m,int n);/*parameter m is a integer,parameter n is the digit of m,this function is used to judge m whether is a Armstrong integer and output it*/int main (int argc, char **argv){int i,len;printf("All 2 digit to 5 digit Armstrong integers are following:\n");for(i=10;i<=99999;i++){len=judgeDigit(i);judgeEqual(i,len);}printf("\n");system("PAUSE");return 0;}int judgeDigit(int m){/*This function return the digit of parameter m*/int len=0;do{++len;m=m/10;}while(m);return len;}void judgeEqual(int m,int n){/*parameter m is a integer,parameter n is the digit of m,this function is used to judge m whether is a Armstrong integer and output it*/int j,temp=m,sum=0;for(j=1;j<=n;j++){sum+=(int)(pow(temp%10,n));temp=temp/10;}if(m==sum)/*if m is equal to sum,that is to say m is a Armstrong integer*/ printf("%d\t",m);}[/td][/tr][/table]【程序输入输出】no input;output:All 2 digit to 5 digit Armstrong integers are following:[color=Red]153[/color] 370 371 407 1634 8208 9474 54748 92727 93084[color=Red]注:用gcc调试就得不到153这个结果,但windows下用vc6.0就可以得到。

不解中,这是编译器问题还是程序问题?[/color]3、【问题描述】将1,2,3,4,5,6,7,8,9共9个数分成三组,组成3个三位数,且使这3个三位数构成1:2:3的比例,例如:3个三位数192,384,576满足以上条件.192:384:576=1:2:3。

试求出所有满足条件的3个三位数。

【思路】1~9组成的最小三位数是123,最大的是987,由于要满足1:2:3的关系,最小的那个数应该不到于987/3=329。

这样的话第一个数的变化范围是123~329,将这里面的数分别乘2、乘3,然后判断这三个数是否符合要求,即这三个数是否由1~9组成,而且各个数字不能相同。

即对每个数n(123<=n<=329)用枚举法。

[list][*]定义函数int judge(int n),用于判断整数n的各位数字是否相同,如果有想同的就返回0;否则返回1;[*]对每个数n(123<=n<=329),2*n,3*n调用judge()函数用于判断这三个数是否由1~9组成且各个数字不相同;[*]判断n,2*n,3*n这三个数中的各位数是否相同,所以对数n*1000*1000+2*n*1000+3*n调用judge()判断。

[/list]所以(judge(n)==0||judge(2*n)==0||judge(3*n)==0||judge(n*1000+2*n*100+3*n)==0)为真的话,即其中给定的n不符合要求。

[color=#ff0000]其实只要([/color]judge(n*1000+2*n*100+3*n)==0[color=#ff0000])这一个条件即可,因为它包含了前面两种情况。

[/color][color=#ff0000]caution:其实要判断这三个数是否由1~9组成且各个数组不相同,即这三个数的各位数是否覆盖了1~9,只要判断各位数字的积是否等于9!且各位数字的和是否等于45。

[/color]【代码】[table=98%][tr][td]cCODE:[/td][/tr][tr][td]#include<stdio.h>#include<stdlib.h>int judge(int n);int main (int argc, char **argv){int l,m,n,p,q;for(l=123;l<=329;l++){m=2*l,n=3*l;p=l*1000+m,q=p*1000+n;if(judge(q)==0)//判断l、m、n是否符合要求。

如果不符合就跳出本次循环,进入下次循环continue;printf("%d,%d,%d\n",l,m,n);}system("PAUSE");return 0;}int judge(int n){//用于判断整数n的各位数字是否相同,如果有想同的就返回0;否则返回1int num[10],i,j,len=0,temp=n;do{++len;temp=temp/10;}while(temp);//求出n的位数for(i=1;i<=len;i++){//将n的各位数字存入num[],并判断是否存在0及相同的数字,如果存在就返回0 if((num=n%10)==0)return 0;n=n/10;for(j=1;j<i;j++)if(num[j]==num)return 0;}return 1;}[/td][/tr][/table][table=98%][tr][td]cCODE:来自一位网友[url=/profile-uid-20771611.html][font=Fixedsys][color= #0000ff]youshuang[/color][/font],即用[color=#ff0000][color=#000000]判断各位数字的积是否等于9!且各位数字的和是否等于45。

[/color][/color][color=#000000])[/color][/td][/tr][tr][td]#include <stdio.h>bool judge( int a, int b, int c ){char tmp_buf[ 10 ];sprintf( tmp_buf, "%d%d%d", a, b, c );int nTimeResult = 1;int nSumResult = 0;for ( int i = 0; i < 9; i++ ){nTimeResult *= ( tmp_buf[ i ] - '0' );nSumResult += ( tmp_buf[ i ] - '0' );}return ( ( nTimeResult == 362880 ) && ( nSumResult == 45 ) );}int main(){for ( int i = 123; i <= 329; i++ ){if ( judge( i, i * 2, i * 3 ) ){printf( "%d, %d, %d \n", i, i * 2, i * 3 );}}return 0;}[/td][/tr][/table]【程序输入输出】no input;output:192,384,576219,438,657273,546,819327,654,9814、【问题描述】和尚挑水某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表:和尚1: 星期二,四;和尚2: 星期一,六;和尚3: 星期三,日;和尚4: 星期五;和尚5: 星期一,四,六;和尚6: 星期二,五;和尚7: 星期三,六,日;请将所有合理的挑水时间安排表【思路】用回朔法求解(递归方式实现,当然也可以用迭代方式)。

相关文档
最新文档