目录
一.代码输出
第一块,是让根据题目去写对相对应的代码
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语言知识点复习------排序法(冒泡、选择、插入)与链表_守约斯维奇的博客-CSDN博客
这一期讲一些C语言非常基础的习题,忘了的同学记得要回来看看呀