C语言-----基础习题复习篇

目录

一.代码输出

1.斐波那契数列

循环实现

递归实现

2.求两个数字最大公约数

3.求满足条件的数字有多少

4.求数组的最大值以及所在的位置

5.删除指定字符

6.进制数转换

 循环实现

递归实现

7.质数的判断和输出

8.到指定字符结束输入

9.实现阶乘

循环实现

递归实现

10.打印九九乘法表 

11.输出三角形

二.输出结果判断

test 1

 test 2

 test  3

   test  4

test  5

 test  6

三.附加篇


一.代码输出

        第一块,是让根据题目去写对相对应的代码

1.斐波那契数列

输出第n个斐波那契数列的值

循环实现

#include<stdio.h>
int main()
{
	int a = 1, b = 1;
	int c, i = 1;
	int n;
	scanf("%d", &n);
	while (i < n)
	{
		c = a + b;
		a = b;
		b = c;
		i++;
	}
	printf("%d", a);
}

 我们知道斐波那契数列是1 1 2 3 5 8……所以我们要提前初始化最开始的两个数字,然后就根据斐波那契数列的规律:后面一个数字等于前面的两个数字相加。然后就把a,b,c依次向后移动,直到我们想要的第n个斐波那契数

递归实现

#include<stdio.h>
int fun(int n)
{
	if (n == 1 || n == 2)
		return 1;
	return fun(n - 1) + fun(n - 2);
}
int main()
{

	int n;
	scanf("%d", &n);
	printf("%d", fun(n));
}

 递归就更加简单了,直接返回前两个数字相加就行了

2.求两个数字最大公约数

已知,a和b,a>b,这里要求这两个数字最大公约数

#include<stdio.h>
int main()
{
	int a, b, c;
	scanf("%d %d", &a, &b);
	while (b)
	{
		c = a % b;
		a = b;
		b = c;
	}
	printf("%d", a);
}

 这个就是比较经典的辗转求余法,就是引入一个c作为两个数字直接的余数,然后就把a赋值为b,把b赋值为c,再一次求余,直到b为0,那么得到最后的最大公约数就是a了

3.求满足条件的数字有多少

求取个位数为6且能被3整除的五位数共有多少

#include<stdio.h>
int main()
{
	long int i;
	int count = 0;
	for (i = 10000; i < 99999; i++)
		if (i % 3 == 0 && i % 10 == 6)
			count++;
	printf("count=%d", count);
}

4.求数组的最大值以及所在的位置

有3*4的整数数组int  a[3][4] ={34,18,23,89,39,15,56,14,48,24,17,63}; ,现要求出最大的那个元素的值

#include <stdio.h>
int main()
{
	int  a[3][4] = { 34,18,23,89,39,15,56,14,48,24,17,63 };
	int   i, j, row, col, max;
	max = 0; row = 0; col = 0;
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 4; j++)
		{
			if (a[i][j] > max)
			{
				max = a[i][j];  row = i;  col = j;
			}
		}
	}
	printf("Max=%d\n", max);
	printf("Row=%d\n", row);
	printf("Col=%d\n", col);
	return 0;
}

先初始化一个max,然后对数组进行循环依次比较,如果出现比max大的数字,就走if 的条件语句,把这个比较大的数字赋值到max,然后获取其位置i,j,没有的话就继续循环 

5.删除指定字符

输入一个字符串s,删除字符串s中的所有数字字符,然后输出结果

#include <stdio.h>
int main()
{
	char s[100] = {};
	gets(s);
	int n = 0, i = 0;
	for (; s[i] != '\0'; i++)
	{
		if ('0' <= s[i] && s[i] <= '9')
			continue;
		else {
			s[n++] = s[i];
		}
	}
	s[n] = '\0';
	puts(s);
	return 0;
}

这个就是对一个字符串进行循环,如果出现数字字符的话,那就把这个数字字符给去掉,接着继续循环,如果没有的话那就把这个字符给到字符串s[n++],最后记得要在s[n]后面加上终止符,就没什么问题了

6.进制数转换

键盘获取一个十进制数字,输出转换为二进制数

 循环实现

#include<stdio.h>
int main()
{
	int n;
	int num[20] = { 0 };//初始化
	int i = 0;
	scanf("%d", &n);
	while (n)
	{
		num[i] = n % 2;
		n = n / 2;
		i++;
	}
	for (i = i - 1; i >= 0; i--)
		printf("%d", num[i]);
}

递归实现

#include<stdio.h>
void fun(int n)
{
	if (n) {
		fun(n / 2);
		printf("%d", n % 2);
	}
	else
		return;
}
int main()
{
	int n;
	scanf("%d", &n);
	fun(n);
}

不同的进制数转换实际上就是不断的求余,然后再去把这个数字进行做除法,这样一直重复下去,直到这个数字变为0,那么这个数字就完成了转换

7.质数的判断和输出

输出0~100以内的质数,(先判断再输出)
#include<stdio.h>
int main()
{
	int i, j;
	for (i = 2; i <= 100; i++)
	{
		bool judge = true;
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				judge = false;
				break;
			}
		}
		if (judge)
			printf("%d ", i);
	}
}

质数:一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数

        所以我们,先去判断这个数字是不是质数,也就是把这个数字求余到比这个数字小的所有数字,如果结果不为0,那么这个就是质数,然后输出就行了

8.到指定字符结束输入

键盘获取字符数据,直到输入* 号,就结束输入,把输出结果输出来,*号不输出

示例:

输入:sdwd6474sad88*

输出:sdwd6474sad88

#include<stdio.h>
int main()
{
	int i = 0;
	char s[100];
	char a = getchar();
	while (a != '*')
	{
		s[i++] = a;
		a = getchar();
	}
	s[i] = '\0';//添加终止符
	puts(s);
}

这也是一个非常基础的题了,但千万要记得在结束之后加上终止符呀!!!

9.实现阶乘

输入一个数字,输出这个数字的阶乘

循环实现

#include<stdio.h>
int main()
{
	int n;
	scanf("%d", &n);
	int sum = 1;
	for (int i = 1; i <= n; i++)
		sum *= i;
	printf("%d", sum);
}

递归实现

#include<stdio.h>
int fun(int n)
{
	if (n == 1)
		return 1;
	return fun(n - 1) * n;
}
int main()
{
	int n;
	scanf("%d", &n);
	printf("%d", fun(n));
}

这个是非常非常基础的了,我们刚刚开始学C语言就已经学了求阶乘,这就不多说了,看看代码就可以回忆起来了。 

10.打印九九乘法表 

#include <stdio.h>
void main()
{
	int i, j;
	for (i = 1; i <= 9; i++)
	{
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%d\t", i, j, i * j);
		}
		printf("\n");
	}
}

 这个没啥好说的的,懂的都懂。

11.输出三角形

 输出一个数字,然后输出相对应的三角形

示例:

输入:4            输入:3

输出  :             输出:      *

   *                                     ***
  ***                                  *****     
 *****                                 ***
*******                                 *
 *****
  ***
   *

#include<stdio.h>
void output(int i)
{
	int j = 0;
	while (j < i)
	{
		for (int k = i - 1; k > j; k--)
			printf(" ");
		for (int k = 0; k <= j * 2; k++)
			printf("*");
		j++;
		printf("\n");
	}
	if (j == i)
	{
		int c = i - 2;
		while (c >= 0)
		{

			for (int k = c; k < i - 1; k++)
				printf(" ");
			for (int k = 0; k <= c * 2; k++)
				printf("*");
			printf("\n");
			c--;
		}
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	output(n);
}

这个就相对比较灵活应用循环去实现图案的删除

二.输出结果判断

         第二块,是给定代码然后判断输出结果

test 1

#include <stdio.h>
int main()
{
	int k = 0;
	char c = 'A';
	do {
		c++;
		switch (c)
		{
		case  'A': k++; break;
		case  'B': k--;
		case  'C': k += 2; break;
		case  'D': k = k % 2; continue;
		case  'E': k = k * 2; break;
		default: k = k / 3;
		}
		k++;
		printf("c=%c\n", c);
	} while (c < 'F');
	printf("k=%d\n", k);
}

自己先想想编译结果是什么?

答案: 

解析:在Switch语句当中,如果出现break的话,那么就结束Switch语句,而不是结束循环;如果出现continue的话,并不是表示结束Switch语句,而是结束本次循环然后进入下一次循环;如果什么都没有的话,那就是继续进行Switch语句。

 test 2

#include <stdio.h>
void main()
{ int i,j;
    for (i=1;i<=5;i++)      
    {                
        for (j=1;j<=6;j++) 
        {
            if (i==4 && j==3) break;
        	printf("%d\t",i+j);
        }
   }   
}

思考5分钟,想想结果是什么。

答案:

 test  3

#include <stdio.h>
#define N 50
int main(void)
{
	int j, k, s;
	for(k = 2; k < N; k++, k++)
	{
		s = 1;
		for(j = k; j < N; j++)
		{
			s += j;
		}
	}
	printf("s=%d\n", s);
}

思考一波………………答案:s=98

解析:第一层循环时,k每次都是加上2,每次s进入第二层循环的时候,s会被赋值为1,所以我们只需要考虑当k=48的时候,也就是最后一次第一层循环的时候,s=1,第二层循环j=k=48,s=1+48=49;然后第二次循环,j=49,s=s+j=49+49=98,然后就结束。所以结果s=98

   test  4

#include <stdio.h>
void f(int);
int main()
{
    int i=12345678;
    f(i);
    return 0;
}
void f(int n)
{
    if(n==0)
        return;
    else
    {
        f(n/10);
        printf("%d", n%10);
        return;
    }
}

一杯咖啡的时间,思考思考。

答案:    12345678

这个题目是通过递归的方法,让数字的正序输出,规则是先递归再输出

test  5

这道题是一道比较经典的题目【C语言】 有n个人(人数可自定义)玩一场死亡游戏,从第一个人开始报数,依次数到第3人就会被处死,然后接着报数直到最后一个人活着,求这个人是几号位?_守约斯维奇的博客-CSDN博客

#include <stdio.h>
#define Nmax 50 
void main() 
{ 
	int i,k,m,n,num[Nmax],*p; 
	n=12;	p=num; 
	for(i=0;i<n;i++) *(p+i)=i+1; 
	i=0;k=0;m=0;
	while(m<n-1) 
	{ 
		if(*(p+i)!=0) k++; 
		if(k==3) {  *(p+i)=0; k=0; m++;} 
		i++; 
		if(i==n) i=0; 
	} 
	while(*p==0) p++; 
	printf("%d",*p); 
}

答案:10

如果想了解更多可以去参考上面的链接,这里就不多解释了。

 test  6

#include <stdio.h>
void main() 
{ char str1[40]="Where there is a will,there is a way!";
  char str2[20]="here",*p1,*p2; 
	int t=0; 
	p1=str1;p2=str2; 
	while(*p1!='\0') 
	{ 
		if(*p1==*p2) 
		{
			while(*p1==*p2 && *p2!='\0') 
			{p1++; p2++;} 
		} 
		else 
			p1++; 
		if(*p2=='\0') t++; 
		p2=str2; 
	} 
	printf("%d",t); 
} 

 思考一下……

答案:3

其实这个是字符串匹配的算法题目,意思是如果出现匹配相同的话,那就进行统计,我们可以看出str1与str2出现匹配的次数是3,所以结果就是3。

        最为经典的算法也就是BF算法跟KMP算法了,想了解更多,可以参考下文

【C语言】数据结构-----字符串匹配之BF算法_守约斯维奇的博客-CSDN博客

【C语言】数据结构-----字符串匹配之KMP算法_守约斯维奇的博客-CSDN博客

三.附加篇

C语言知识点复习------排序法(冒泡、选择、插入)与链表_守约斯维奇的博客-CSDN博客

 这一期讲一些C语言非常基础的习题,忘了的同学记得要回来看看呀

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fitz&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值