C语言 100道经典编程题适用于专升本,专接本【详细分析版】_c语言专升本题目(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

🎉前言

🎉欢迎关注🔎点赞👍收藏⭐️留言📝
🎉推荐up主专题文章【C语言编程一百题

🍭作者水平很有限,如果发现错误,请及时告知作者哦!感谢感谢!

本篇涵盖C语言100道常见的编程题,适用于“专接本,专升本,考研,期中期末考试”,每道题都是亲自手动打出来的,也在编译器上测试过,每道题都有相关的详细注释,如有发现错误,欢迎评论区指正。对于零基础伙伴或者没咋做过编程题的小伙伴真心希望将这篇文章的每道题至少【做三遍】,没有人做一遍就能全部都学会,我自己在做编程题时也是做了好几遍,做完之后过一段时间可能也会忘,这就说明还是不熟,就像打王者荣耀时,你不可能上去就会玩的很好,如果你有英雄联盟基础肯定是稍微熟悉一下王者就可以很快上手,其实做这些题也是,锻炼的是一种意识,意识就熟能生巧,很喜欢韩顺平老师课上提到的一句话:“我亦无他,唯手熟尔”,其实也没什么,就是手熟罢了!记住哦!多做几遍,这些题应付接本,升本,绰绰有余。加油,铁铁!

⭐️1.十进制数转任意进制数

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
int i = 0, j = 0, num[20], base, n = 0;
char ch[] = { ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’,
‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’ };
printf(“请输入一个数:”);
scanf(“%d”, &n);
printf(“请输入要转换的进制数:”);
scanf(“%d”, &base);
do{
//255 转16
// (1) 255%16=15 15放入num[0] 255/15=15
//(2) 15%16=15 15放入num[1] 15/16=0 n==0 退出 15正是char数组元素 F 的下标

num[i] = n%base;
//n%base得出来的余数最大不会大于base
n = n / base;
i++;

} while (n != 0);

//最先的余数是在最后面打印

//–i 因为在里面多加了一次
for (j = --i; j >= 0; j–){
printf(“%c”, ch[num[j]]);
}
return 0;
}

在这里插入图片描述

⭐️2.数字三角形

⭐️本题需要看图代数去试:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
int i, j, k,t=0;
for (i = 1; i <= 9; i++){
t = 0;
//第一次是8个空格
while (8 - i >= t){//打印空格
t++;
printf(" “);
}
for (j = 1; j <= i; j++)//打印左半边三角形
printf(”% d", j);
for (k = i - 1; k > 0; k–)//打印右半边三角形
printf(“% d”, k);
printf(“\n”);
}

return 0;
}

在这里插入图片描述

⭐️3. 编程求某年第 n 天的日期。

⭐️用数组表示月天数。

int main(){
int year, days, month = 0;
int a[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
printf(“请输入年,天数:”);

scanf(“%d%d”, &year, &days);

int t = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
//判断闰年

while (days > 0 && days < 365 + t){//<=0跳出
days -= a[month];//总天数减去每个月份的天数
month++;
}
if (days < 0){//若是days<0了 月份-1 在天数上加回来 days 加这个月的天数
//2022 50天 50天-1月=19天 19-28天 =-9 month=2 month-1=1
//1是a[1] days=-9 -9+28 =19 也就是2月19日
month–;
days += a[month];
//最后一次的时候天数不够减 days为负数了要加回来,变为每月的多少号
}
//month也是代表数组下标 0开始
printf(“%d-%d-%d \n”, year, month + 1, days);
return 0;
}

在这里插入图片描述

⭐️求周岁

⭐️4.功能: 输入一个学生的生日(年: y0、 月: m0、 日: d0), 并输入当前日期(年: y1、 月: m1、 日: d1)。 求出该学生的年龄(实足年龄)

int main()
{
	int age, y0, y1, m0, m1, d0, d1;
	printf("输入生日日期(年,月,日) ");
	/\*\*\*\*\*\*\*\*\*\*\*SPACE\*\*\*\*\*\*\*\*\*\*\*/
	scanf("%d%d%d", &y0, &m0, &d0);
	printf("输入当前日期(年,月,日)");
	scanf("%d%d%d", &y1, &m1, &d1);
	age = y1 - y0;
	/\*\*\*\*\*\*\*\*\*\*\*SPACE\*\*\*\*\*\*\*\*\*\*\*/
	if (m0>m1)age--;//生日月份大于当前月份 2000 12 31 2022 6 2 
	/\*\*\*\*\*\*\*\*\*\*\*SPACE\*\*\*\*\*\*\*\*\*\*\*/
	if ((m0 == m1) && (d0>d1))age--; //两个月份相等的情况下 生日日期大于当前日期 age--
	printf("age=%3d", age);
	return 0;

⭐️5.编程求出使该算式成立时的这两个数,

⭐️5.功能: 算式: (空)2 * 7(空) = 3848 中缺少一个十位数和一个个位数编程求出使该算式成立时的这两个数, 并输出正确的算式。

//功能: 算式: (空)2 * 7(空) = 3848 中缺少一个十位数和一个个位数。
//编程求出使该算式成立时的这两个数, 并输出正确的算式。

int main(){
int m, n;
for (m = 1; m <= 9; m++){
for (n = 0; n <= 9; n++){
if ((10 * m + 2)*(7 * 10 + n) == 3848){
printf(“%d*%d”, 10 * m + 2, 70 + n);
}
}
}
return 0;
}

⭐️6.功能:(较难不用看) 编程求任意给两个日期(年 月 日)相差的天数。

//功能: 编程求任意给两个日期(年 月 日)相差的天数。
void date(int startyear, int startmonth, int startday, int endyear,
int endmonth, int endday){
int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

int flagmonth_sta, flagmonth_end, i, j,total=0;

for (i = startyear; i <= endyear; i++){
if (i == startyear)
//开始年的月,按从开始的月计算
flagmonth_sta = startmonth;
else flagmonth_sta = 1;//否则在1月开始

if (i == endyear)
//若是末尾年月份在末尾月结束
flagmonth_end = endmonth;
else flagmonth_end = 12;//否则就在12结束

//累加这一年月份的日子
for (j = flagmonth_sta; j <= flagmonth_end; j++){

//判断是不是闰年
if (flagmonth_end > 2 && (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)){
arr[2] = 29;
}
else arr[2] = 28;

int start_day, end_day;
if (startmonth == j&&i==startyear)
//是起始年的起始月
start_day = startday;
else start_day = 0;//否则天数是0

if (endmonth == j&&i == endyear)
//终止年的终止月 设为传过来得天数
end_day = endday;
else end_day = arr[j];//否则是数组的天数

//;累加当前月份的日子
for (int n = start_day; n <= end_day; n++)
{
total++;
}

}

}
printf(“%d”, total-1);

}

int main(){
int startyear, startmonth, startday;
int endyear, endmonth, endday;
printf(“请输入开始的年月日:”);
scanf(“%d%d%d”, &startyear, &startmonth, &startday);
printf(“请输入终止的年月日:”);
scanf(“%d%d%d”, &endyear, &endmonth, &endday);
date(startyear, startmonth, startday, endyear, endmonth, endday);

return 0;
}

⭐️7.把一个数的二进制奇数位和偶数位交换

//写一个函数把一个数的二进制奇数位和偶数位交换
void Print(int num){
int arr[32],count=0;

while (num){
arr[count++]=num % 2;
num /= 2;
}
for (int i = count-1; i >= 0; i–)
printf(“%d “, arr[i]);
printf(”\n”);
}
int Swap(int num){
return ((num & 0xaaaaaaaa) >> 1) + ((num & 0x55555555) << 1);
}
int main(){
int num = 0;
printf(“请输入一个数:”);
scanf(“%d”, &num);
printf(“初始二进制位:\n”);
Print(num);
int result=Swap(num);
printf(“Swap后十进制 = %d \n Swap后二进制位:\n”,result);
Print(result);

return 0;
}

在这里插入图片描述

在这里插入图片描述

⭐️8.题目要求找出数组中的两个单身狗

⭐️即数组中只有x个元素是单独不一样的,别的都是有相同的兄弟

//题目要求找出数组中的两个单身狗,即数组中只有x个元素是单独不一样的,
//别的都是有相同的兄弟
int main(){
int arr[10] = { 1, 2, 5, 4, 9, 0, 1, 2, 3, 4 };
int flag;
//10个数循环比较10次
for (int i = 0; i < 10; i++){
flag = 0;
//每个擂主要和全部的人比较,包括自己
for (int j = 0; j < 10; j++){
if (arr[i] == arr[j]){
flag++;//会和自己本身比较一下,所以找到单身狗flag=1 不是的大于1
}
}
if (flag <= 1)printf(“单身狗= %d\n”, arr[i]);
}
return 0;
}

在这里插入图片描述

⭐️9. 数字字符串转换为整数

//数字字符串转换为整数
int isNumber(char a[]){
//-123
int i = 0, flag = 0;
if (a[0] == ‘-’){
//判断是不是数字字符
for ( i = 1; a[i] != ‘\0’; i++){
if (!(a[i] >= ‘0’&&a[i] <= ‘9’))
break;
}
if (a[i] == ‘\0’)
flag = -1;
//若是判断是负数的数字字符返回-1
}
else {//不是负数数字字符的情况
for (i = 0; a[i] != ‘\0’; i++){
if (!(a[i] >= ‘0’&&a[i] <= ‘9’))
break;
}
if (a[i] == ‘\0’)
flag = 1;//若是正数数字字符满足条件返回1

}
return flag;//0的情况是不是合法字符

}
void str_num(char a[]){
int i = 0,num=0,flag=1;//整数的符号
int start=-1;//判断字符串转换的起始位置
//判断是不是数字字符串
int flag11=isNumber(a);
if (flag11 == 0){
printf(“不是合法数字字符\n”);
return;
}
else if (flag11 == -1){//负数数字字符串转换为整数
flag = -1;
start = 1;
}
else if (flag11 == 1){
flag = 1;
start = 0;
}
//转化
for (i = start; a[i] != ‘\0’; i++){
num = num * 10 + a[i] - ‘0’;
}
num *= flag;
printf(“转换为的整数字符是:%d\n”, num);

}
int main(){
char a[10];
printf(“请输入一个字符串:”);
gets(a);
str_num(a);
return 0;
}

在这里插入图片描述

⭐️10.升序的数组插入一个数,还保持升序

//升序的数组插入一个数,还保持升序
void insert(int a[], int n,int sz){
int i = 0;
for (i = sz - 2; i >= 0; i–){
if (n < a[i]){//n小于数组的元素,该元素向后挪
a[i + 1] = a[i];
}
else {//否则就插入
a[i + 1] = n;
break;
}
}
//插入的数比数组元素都小的情况
if (i == -1)
a[0] = n;

}
int main(){
int a[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 10, 12 };
int sz = sizeof(a) / sizeof(a[0]);
int n = 0;
printf(“请输入一个数字:”);
scanf(“%d”, &n);
insert(a, n,sz);
for (int i = 0; i < 11; i++){
printf("%d ", a[i]);
}
return 0;
}

在这里插入图片描述

⭐️11.输入年 月 判断该月多少天

//输入年 月 判断该月多少天
#include<stdio.h>
int main(){
int y = 0;
int m = 0;//天数固定设计一个数组
int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
while (scanf(“%d %d”, &y, &m) != EOF){//ctrl+Z退出
int day = arr[m];//不要对arr[m]直接修改会改动数组内容
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0){
if (m == 2)
day += 1;
}
printf(“%d\n”, day);
}
return 0;
}

⭐️12 遍历法求名次

在这里插入图片描述

int main(){
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for (a = 0; a <= 5; a++){
for (b = 0; b <= 5; b++){
for (c = 0; c <= 5; c++){
for (d = 0; d <= 5; d++){
for (e = 0; e <= 5; e++){
//他们每个人说的对一半,逻辑值相加才等于1
if ((b == 2) + (a == 3) == 1
&& (b == 2) + (e == 4) == 1
&& (c== 1) + (d == 2) == 1
&&(c == 5) + (d == 3) == 1
&& (e == 4) + (a == 1) == 1){
if (a*b*c*d*e==120)//并且5个人的排名不能相同
printf(“a=%d,b=%d,c=%d,d=%d,e=%d\n”, a, b, c, d, e);

}
}
}
}
}
}
return 0;
}

在这里插入图片描述

⭐️13. 谁是凶手

在这里插入图片描述

int main(){
char murder;
for (murder = ‘A’; murder <= ‘D’; murder++){
//遍历这四个人,且要满足这4个条件
if ((murder != ‘A’) + (murder == ‘C’) + (murder == ‘D’) + (murder != ‘D’)
==3){//这四个条件里面3个真的一个假的,所以相加后的逻辑值 ==3才行
printf(“murder是 %c\n”, murder);
}
}
return 0;
}

⭐️14.输入一个整数数组,实现一个函数,来调整数组中的奇数和偶数的位置,奇数在前偶数在后

//法1
void reverse(int a[], int sz, int temp1[], int temp2[]){
int j_num = 0, o_num=0, i;
for (i = 0; i < sz; i++){
if (a[i] % 2 == 0){//存到偶数暂存数组
temp1[o_num++] = a[i];
}
else if (a[i] % 2 != 0){
temp2[j_num++] = a[i];
}
}
for (i = 0; i < j_num; i++){//所有奇数放回去
a[i] = temp2[i];
}
for (int j=0; j < o_num; j++,i++){//所有偶数放回去
a[i] = temp1[j];//j来控制偶数数组下标
}

}
int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int temp1[10];//暂存奇数偶数的数组
int temp2[10];
int sz = sizeof(a) / sizeof(a[0]);
reverse(a, sz,temp1,temp2);
for (int i = 0; i < sz; i++){
printf("%d ", a[i]);
}
return 0;
}

⭐️法2:

//法2
void reverse(int left[], int right[]){
//left指向起始 right指向数组末尾
while (left < right){
while ((left<right)&&*left % 2 != 0){
left++;//如果*left是奇数就循环接着向后指,直到指向偶数就退出
}
//(left<right)是避免全是奇数的情况,指导最后一个元素,在向后指就越界了
while ((right>left)&&*right % 2 == 0){
right–;//如果*right是偶数就循环接着向前指,直到指向奇数就退出

}

//左边的偶数和右边的奇数交换
if (left < right){
int temp = *left;
*left = *right;
*right = temp;
}
}
}
int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int sz = sizeof(a) / sizeof(a[0]);
reverse(a, a+sz-1);
for (int i = 0; i < sz; i++){
printf("%d ", a[i]);
}
return 0;
}

在这里插入图片描述

⭐️15.1元一瓶汽水,两个空瓶可以换一瓶,问20元可以喝多少瓶

int main(){
int total = 0, empty = 0, money;
printf(“请输入钱数:”);
scanf(“%d”, &money);
total = money;//初始瓶子数
empty = money;//空瓶数
while (empty >= 2){//大于等于2才能换
total += empty / 2;//两瓶换一瓶换的累加到总和上去
empty = empty / 2 + empty % 2;//更新空瓶数量有奇数瓶的要加上
}
printf(“能喝 %d 瓶\n”, total);
return 0;
}

⭐️16.打印一个菱形,输如n的打印2*n - 1行的菱形

//打印一个菱形,输如n的打印2*n - 1行的菱形

int main(){
int n = 0;
printf(“请输入一个数字:”);
scanf(“%d”, &n);
int i, j;
for (i = 0; i < n; i++){//打印上三角
//打印空格
for (j = 0; j < n - 1 - i; j++){
printf(" “);
}
//打印*
for (j = 0; j <= 2 * i; j++){
printf(”*“);
}
printf(”\n");
}
//打印下三角
for (i = 0; i < n - 1; i++){
//打印空格
for (j = 0; j <= i; j++){
printf(" “);
}
//打印*
for (j = 0; j <= 2 * n - 4 - 2 * i; j++){
printf(”*“);
}
printf(”\n");
}
return 0;
}

在这里插入图片描述

⭐️17.输入一个整数找出紧跟在他后面的素数

//输入一个整数找出紧跟在他后面的素数
int find(int n){
int i;
while (n){
for ( i = 2; i < n; i++){
if (n%i == 0){
break;
}
}
if (n == i)return n;
n++;
}
printf(“输入不合法”);
return -1;
}
int main(){
int n = 0;
printf(“请输入一个大于1的数:”);
scanf(“%d”, &n);
printf(“紧跟的素数是:%d”, find(n));
return 0;
}

在这里插入图片描述

⭐️18.计数求和,Sn=2+22+222+2222+22222

int main(){
int a = 0, total = 0, n = 0, temp = 0;
printf(“请输入一个数:a\n”);
scanf(“%d”, &a);
printf(“请输入这个数的幂次:n\n”);
scanf(“%d”, &n);

while (n){
//第一次 0*10+2=2 第二次 2*10+2=22 …
temp = temp * 10 + a;
//累加
total += temp;
n–;//次数-1
}
printf(“%d”, total);
return 0;
}

⭐️19.输入两个数求最小公倍数和最大公因数,代码中有详解

⭐️法1:

///输入两个数求最小公倍数和最大公因数,代码中有详解
//法1

int main(){
int n, m;
printf(“请输入两个数:”);
scanf(“%d%d”, &n, &m);
if (m < n){//m存大数,n存小数
m = m^n;
n = n^m;
m = n^m;
}
int p = m*n;

int i;
for ( i = n; i >= 1; i–){
//两个数的因子最多不会超过小数n,所以从n开始向下试
//并且要满足这个条件
if (m%i == 0 && n%i==0){
printf(“最大公因数=%d\n”, i);
break;
}
}
printf(“最小公倍数就是两数的积除以最大公约数=%d”, p / i);

return 0;
}

⭐️法2:

//法2

int main(){
int n, m;
printf(“请输入两个数:”);
scanf(“%d%d”, &n, &m);
if (m < n){//m存大数,n存小数
m = m^n;
n = n^m;
m = n^m;
}
int p = m*n;

int r = 0;
while (n){
r = m%n;
m = n;
n = r;
}

printf(“最大公约数是:%d, 最小公倍数是:%d\n”, m, p / m);
return 0;
}

⭐️递归版

//递归方法求最大公约数
int fun(int m, int n){
if (n == 0)return m;
else {
int r = m%n;
m = n;
n = r;
return fun(m, n);
}
}

int main(){
int m, n;
printf(“请输入两个数:\n”);
scanf(“%d%d”, &m, &n);
if (m < n){
int t = m;
m = n;
n = t;
}

printf(“最大公约数是:%d\n”, fun(m, n));
return 0;
}

⭐️20.一个数 +100之后是完全平方数,+168还是一个完全平方数

//一个数 +100之后是完全平方数,+168还是一个完全平方数
//2*2=4 3*3=9 就是完全平方数
#include<math.h>
int main(){
int n = 1, t = 0, k = 0,m=0,k1;
while (n){

k1 = sqrt(n+100);//返回一个double 放int 直接取整了
k = sqrt(n+168);
if (k*k == n+168&&k1*k1==n+100){
printf(“%d”,n);
break;
}
n++;
}
return 0;
}

在这里插入图片描述

⭐️21 .数字金字塔

//数字金字塔
int main(){
int n = 0;
printf(“请输入一个数:”);
scanf(“%d”, &n);
int i = 0, j = 0;
//打印三角
for (i = 0; i < n; i++){
//打印空格
for (j = 0; j < n - 1 - i; j++)
printf(" “);
//打印*
for (j = 0; j <= 2*i; j++){
printf(”%d", n);
}
printf(“\n”);
}
return 0;
}

在这里插入图片描述

⭐️22.字符串左旋

⭐️实现一个函数,可以左旋字符中的K个字符 例如:ABCD左旋一个字符变成BCDA ABCD左旋两个字符变成CDAB

//字符串左旋
//实现一个函数,可以左旋字符中的K个字符
//例如:
//ABCD左旋一个字符变成BCDA
//ABCD左旋两个字符变成CDAB
void reverse(char a[], char n){
int end=strlen(a) - 1,i;//end指向最后一个
char temp;
while (n){
temp = a[end];//把最后一个挪到temp暂存
//从倒数第2个开始向前挪
for (i = end - 1; i >= 0; i–){
a[i + 1] = a[i];
}
//挪完把temp的字符放到a[0]
a[0] = temp;
n–;
}
}
int main(){
char a[20];
printf(“请输入一个字符串:”);
gets(a);
int n = 0;
printf(“请输入一个左旋的数字:”);
scanf(“%d”, &n);
reverse(a,n);
printf(“%s\n”, a);
return 0;
}

在这里插入图片描述

⭐️23.【稍难不用看】要求:写一个函数判断一个字符串是否是另一个字符串旋转后得到的

⭐️ 例如:ABCDE与EDCBA这俩个显然是abcd与ABCD 这显然不是

//要求:写一个函数判断一个字符串是否是另一个字符串旋转后得到的
//例如:ABCDE与EDCBA这俩个显然是
//abcd与ABCD 这显然不是
#include<string.h>
int judge_string(char* str1, char* str2){
int i, j = 0;
int len = strlen(str1);
//循环字符串长度次
for (i = 0; i < len; i++){
//先比较两个字符串是不是相等
if (strcmp(str1, str2) == 0)
return 1;

//不相等,挪1位在判断是不是相等
char endchar = str1[strlen(str1)-1];
//从倒数第2个开始向前挪
for (j = strlen(str1) - 2; j >= 0; j-- ){
str1[j + 1] = str1[j];
}
str1[0] = endchar;
//接着循环比较挪完1位的是不是相同了
}
return 0;
}
int main(){
char arr1[10] = “ABCDEF”;
char arr2[10] = “CDEFAB”;
int ret = judge_string(arr1, arr2);//返回1 说明是,返回0 不是
if (ret == 1){
printf(“yes”);
}
else printf(“no”);
return 0;
}

在这里插入图片描述

⭐️24.给数组删除重复的元素

//给数组删除重复的元素
#include<stdio.h>
#define N 12
int main(){
int a[N] = { 1, 1, 2, 3, 3, 4, 6, 4, 8, 6,9,8};
int i = 0, j = 0, n = N;
//n个数比较n-1次
printf(“==去重之前=\n”);
for (i = 0; i < n; i++){
printf("%d ", a[i]);
}
for (i = 0; i < n - 1; i++){

for (j = i + 1; j < n; j++){
if (a[i] == a[j]){
//i位置上的数和后面的比较要是相同,依次向前挪
for (int k = j; k < n - 1; k++){
a[k] = a[k + 1];
}
–n;//把一个数字给干掉了所以n–;
–j;//从j+1后面的位置一直依次向钱挪 j位置被换了新值,所以–j还要再次看
//当前j位置的数与前面的重复嘛
}

}
}
printf(“\n==去重之后=\n”);
for (i = 0; i < n; i++){
printf("%d ", a[i]);
}
return 0;
}

在这里插入图片描述

注意n–了之后,循环的访问范围就减少一个,所以被挪一个减少一个访问范围

⭐️25.C语言编程题求1! + 2! + 3! + 4!… + N!

//C语言编程题————求1! + 2! + 3! + 4!… + N!
int main(){
int total = 0, t = 1, i = 0;
int n;
printf(“请输入一个数:”);
scanf(“%d”, &n);
for (i = 1; i <=n; i++){
t *= i;//累乘 第一次 1! 第二次 2!

printf(“%d的阶乘 : %d\n”, i,t);
total += t;//累加阶乘
}
printf(“总和 %d! :%d\n”, n, total);
return 0;
}

在这里插入图片描述

⭐️26.C语言编程题求斐波那契数(循环法与递归法)

⭐️递归法

//法1 递归法
int fib(int n){
if (n > 2){
return fib(n - 1) + fib(n - 2);
}
else return 1;
}
int main(){
int n = 0;
printf(“您要得到第几个菲薄纳妾数:”);
scanf(“%d”, &n);

printf(“%d\n”, fib(n));

return 0;
}

⭐️普通的方法

//斐波那契数列 1,1,2,3,5,8,13,21 前面的两个数的和是后面这个数
int fib1(int n){
int a = 1, b = 1, c = 1;
//a是前2个数 b是前1个数
while (n > 2){
c = a + b;//(1) 1+1=2 (2) 1+2=3
a = b;// (1) a=1 (2) a=2 前一个数等于后一个数

b = c;// (1) b=2 (2) b=3 算出的C就是下次循环要相加的后一个数
n–;
}
return c;// 第1位 第2位 都是 1
}
int main(){
int n = 0;
printf(“您要得到第几个菲薄纳妾数:”);
scanf(“%d”, &n);

printf(“%d\n”, fib1(n));

return 0;
}

⭐️数组的方法:

//数组法
int main(){

int a[500];
int n = 0;
printf(“请输入一个数n:\n”);
scanf(“%d”, &n);
int i;
a[0] = 1, a[1] = 1;
for (i = 2; i <=n; i++){
a[i] = a[i - 1] + a[i - 2];
//前1个数+前2个数=当前数
//也就是为数组赋值
}

printf(“打印前n个斐波那契数===============\n”);
for (i =0 ; i <=n; i++){

printf(“%6d “, a[i]);
//每行打印5个
if ((i + 1) % 5 == 0)printf(”\n”);

}
return 0;
}

在这里插入图片描述

⭐️27.C语言编程输入n,k求n的k次幂(递归与非递归)

⭐️递归法:

//C语言编程————输入n,k,求n的k次幂(用递归的方法)
int fun(int n, int k){
if (k <1)return 1;//0次幂都是1
else return n*fun(n, k - 1);//否则 n*多次调用fun
}
int main(){
int n, k;
printf(“请输入(n,k):”);
scanf(“%d%d”, &n,&k);
printf(“%d”, fun(n, k));
return 0;
}

递归过程图:

在这里插入图片描述

⭐️非递归法:

//C语言编程————输入n,k,求n的k次幂(非递归的方法)
int fun(int n, int k){
int total = 1;
while (k–){
total *= n;
}
return total;
}
int main(){
int n, k;
printf(“请输入(n,k):”);
scanf(“%d%d”, &n,&k);
printf(“%d”, fun(n, k));
return 0;
}

⭐️28.(递归)输入一个数,把他的每一位相加在输出出来;

⭐️如1234 1 + 2 + 3 + 4 = 10

//用函数实现输入一个数,把他的每一位相加在输出出来;如1234 1 + 2 + 3 + 4 = 10
int deal(int num){
if (num > 9)
return num % 10 + deal(num / 10);
//大于9 就先%10 得到余数 在加 deal(num/10)若小于10 单一一个数直接返回这个数
else return num;
}
int main(){
int num = 0;
printf(“请输入一个数:”);
scanf(“%d”, &num);
printf(“%d各位相加之后的和是:%d\n”, num, deal(num));
return 0;
}

在这里插入图片描述

⭐️29.实现函数把字符数组的元素逆序 如“abc“, 逆序成“cba“.

⭐️非递归版

//实现函数把字符数组的元素逆序 如“abc“, 逆序成“cba“.

void reverse(char a[]){
int start = 0, end = strlen(a) - 1;//-1为了不去挪’\0’
while (start < end){
//首尾交换 直到start和end都指向同一个或者start>end时候结束交换
char temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;//向后指
end–;//向前指
}

}
int main(){
char a[20];
printf(“请输入一个字符串:”);
gets(a);
reverse(a);
printf(“逆序之后:%s\n”, a);
return 0;
}

⭐️递归版:

void reverse(char a[]){
char temp = a[0];//进来之后先把当前数组的首元素赋值到临时变量

int len = strlen(a) - 1;//指向最后一个元素

a[0] = a[len];//把最后一个元素给第一个元素空间

a[len] = ‘\0’;//把最后一个元素赋值’\0’

if (len >= 2){//若是字符串长度大于2就要交换
reverse(a + 1);//再次调用 向前指一个
}
//完成递归之后 把在栈中的每个temp返回放到当前a[len]中
a[len] = temp;
}

int main(){
char a[20];
printf(“请输入一个字符串:”);
gets(a);
reverse(a);
printf(“逆序之后:%s\n”, a);
return 0;
}

在这里插入图片描述

⭐️30. 递归拆分整数

//递归拆分整数
void deal(int n){
if (n > 9)deal(n / 10);
printf(“%d “, n % 10);
}
int main(){
int num = 0;
printf(“请输入一个数:\n”);
scanf(”%d”, &num);
deal(num);
return 0;
}

在这里插入图片描述

⭐️31.设计以函数打印乘法口诀表,

⭐️输入9,是99乘法表,输入8是88乘法表

//设计以函数打印乘法口诀表,输入9,是99乘法表,输入8是88乘法表
void Print1(int n){
int i = 0, j = 0;
for (i = 1; i <= n; i++){
for (j = 1; j <= i; j++){
printf(“%d*%d=%3d “, i, j, i*j);
}
printf(”\n”);
}
}
int main(){
int num = 0;
printf(“请输入一个数:”);
scanf(“%d”, &num);
Print1(num);
return 0;
}

在这里插入图片描述

⭐️32.构造一函数判断是否为素数100-200之间(只能被自己和1整除的数)

//素数100 - 200之间(只能被自己和1整除的数)
int main(){
int i = 0;
for (i = 100; i <= 200; i++){
int j;
for (j = 2; j < i; j++){
if (i%j == 0)break;
}
if (i == j)printf(“%4d”, i);
}
return 0;
}

在这里插入图片描述

⭐️33.打印二进制数的奇数位和偶数位;分别打印二进制序列

//打印二进制数的奇数位和偶数位;分别打印二进制序列
void Print_two(int n){
int i;

printf(“打印奇数位:\n”);
//右移0位是第一个二进制 所以右移 30位其实是第31个二进制位
for (i = 30; i>=0; i-=2){
printf(“%d “, (1 & (n >> i)));
}
printf(”\n打印偶数位:\n”);
//右移1位是第二个二进制 所以右移 31位其实是第32个二进制位
for (i = 31; i >= 0; i -= 2){
printf(“%d “, (1 & (n >> i)));
}
}
int main(){
int n = 0;
printf(“请输入一个数字:”);
scanf(”%d”, &n);
Print_two(n);
return 0;
}

在这里插入图片描述

⭐️34.计算M和N二进制中不同的位数,例如 1和7 有两位不同;

//计算M和N二进制中不同的位数,例如 1和7 有两位不同;
int main(){
int n, m;
printf(“请输入2个数:”);
scanf(“%d%d”, &n, &m);
int t = m^n;//通过二进制亦或后,相同为0不同为1,故此t里面1的个数就代表n和m之间有几个二进制位
//不同

//求出t里面有多少个1
int count = 0, i = 0;
while (i < 32){//移位32次 移了31位
//右移1位与1==1就说明当前二进制位是1
if (t >> i & 1 == 1){
count++;
}
i++;
}
printf(“二进制位不同有%d位\n”, count);
return 0;
}

在这里插入图片描述

⭐️35.输出1900到2000之间的所有闰年

//输出1900到2000之间的所有闰年
int main(){
for (int i= 1900; i <= 2000; i++){//世纪闰年 必须是400的倍数
if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0 ))
{
printf("%d是闰年 ",i);
}
}
}//润年分为世纪闰年和普通润年
//普通闰年是 能整除4就行 为啥还要加%100不等于0呢 排除不是世纪闰年的 比如1900 不是闰年
//整百数的世纪闰年是 能整除400就行

⭐️36. 猴子吃桃问题

⭐️有一群猴子,去摘了一堆桃子*商量之后决定每天吃剩余桃子的一半当每天大家吃完桃子之后,有个贪心的小猴都会偷偷再吃一个桃子按照这样的方式猴子们每天都快乐的吃着桃子直到第十天,当大家再想吃桃子时,发现只剩下一个桃子问:猴子们一共摘了多少桃子

当前天吃前一天的一半零一个 .prvday/2+1=curday ---->(curday+1)*2=prvday
前一天/2+1=当前天的数量

/*有一群猴子,去摘了一堆桃子*/

/*商量之后决定每天吃剩余桃子的一半*/

/*当每天大家吃完桃子之后,有个贪心的小猴都会偷偷再吃一个桃子*/

/*按照这样的方式猴子们每天都快乐的吃着桃子*/

/*直到第十天,当大家再想吃桃子时,发现只剩下一个桃子了*/

//问:猴子们一共摘了多少桃子

//当前天吃前一天的一半零一个
//prvday/2+1=curday ---->(curday+1)*2=prvday
//前一天/2+1=当前天的数量

int main(){
int curday = 1, prvday = 0;
int days = 9;
while (days > 0){
//第一次循环 算出第一次前一天的数量
prvday = (curday + 1) * 2;

curday = prvday;//前一天的数量在给到当前天 接着循环
days–;
}
printf(“猴子摘了%d个桃子\n”, curday);
return 0;
}

⭐️37.选择排序法 升序排列

在这里插入图片描述

Print_(int *a,int sz){
printf(“打印数组情况===============\n”);

for (int i = 0; i < sz; i++){
printf(“%d “, a[i]);
}
printf(”\n”);
}

//选择排序法 升序排列
int main(){
int a[10] = { 1, 4, 7, 2, 5, 8, 3, 6, 9, 0 };
int i, j, index;
int sz = sizeof(a) / sizeof(a[0]);
//10个数循环比较9次就行
for (i = 0; i < sz - 1; i++){
index = i;//index看为擂主
for (j = i + 1; j < sz; j++){
//index和j下标的打擂台,让index指向最小的数
if (a[index] >a[j])index = j;

}
if (index != i){//把最小的数放到i下标的位置
int t = a[index];
a[index] = a[i];
a[i] = t;
}
}

Print_(a,sz);

return 0;
}

⭐️38.冒泡排序法

⭐️比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定性算法。

冒泡排序基础的排序算法,也是我们必须要牢牢掌握的一种算法。

//冒泡排序法
int main(){
int a[10] = { 1, 4, 7, 2, 5, 8, 3, 6, 9, 0 };
int i, j;
int sz = sizeof(a) / sizeof(a[0]);
//10个数循环比较9次就行
for (i = 0; i < sz - 1; i++){

for (j = 0; j < sz - 1 - i; j++){
//从0号下标开始和后面的比较,若是当前j号大于j+1号就交换
//第1轮把最大的放到最后,所以j < sz - 1 - i 减i为了
//之前挪到后面的较大数不在发生没必要的比较

if (a[j]>a[j + 1]){
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}

Print_(a, sz);
return 0;
}

在这里插入图片描述

⭐️39.求3*3矩阵对角元素的和

//求3*3矩阵对角元素的和
int main(){
int total = 0, a[3][3] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 };
int i,j;
//主对角
for (i = 0; i < 3; i++){
total += a[i][i];
}
//副对角
for (i = 0, j = 2; i < 3; i++, j–){
if (i != j){
total += a[i][j];
}
}

printf(“total=%d\n”, total);
return 0;
}

⭐️40.把整数数组中的元素值逆序存放

//把整数数组中的元素值逆序存放

int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int left=0, right = sizeof(a) / sizeof(a[0])-1;

while (left < right){
int t = a[left];
a[left] = a[right];
a[right] = t;
left++;
right–;
}

Print_(a, 10);//打印函数
return 0;

}

在这里插入图片描述

⭐️41.杨辉三角形

//杨辉三角形
//int main(){
// //利用二维数组
// int a[10][10];
// for (int i = 0; i < 10; i++){//循环10次
// for (int j = 0; j <= i; j++){
// if (0 == j || i == j){
// a[i][j] = 1;//对角线元素和0列赋值
// }
// else{//其余元素赋值
// a[i][j] = a[i - 1][j] + a[i - 1][j - 1];
// }
// }
// }
// for (int i = 0; i < 10; i++){
// for (int j = 0; j <= i; j++){
// printf(“%4d”, a[i][j]);
// }
// printf(“\n”);
// }
// return 0;
//}

在这里插入图片描述

⭐️42.折半查找—必须建立在有序的数组中

//折半查找—必须建立在有序的数组中
int main(){
int a[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11 };
//left指向第一个 right指向最后一个
int left = 0, right = sizeof(a) / sizeof(a[0])-1;

int n,mid=right;//第一次指向最后一个
printf(“请输入要查找得数:”);
scanf(“%d”, &n);

while (left < right){

if (a[mid] < n){//中间元素<n 说明当前左边的全小于n
left = mid;//所以left等于mid
}
else if (a[mid]>n){//中间元素>n 说明当前右边的全大于n
right = mid;//所以right等于mid
}
else {
printf(“找到了 下标是%d\n”, mid);
break;
}
mid = (left + right) / 2;//在除以2改变循环条件
}

if (left >= right)printf(“没有找到该元素\n”);
return 0;
}

在这里插入图片描述

⭐️43. 计算3行 80个字符 的类型个数

// 计算3行 80个字符 的类型个数
int main(){
char ch[3][80];
int i = 0;
//输入3行字符
//for (i = 0; i < 3; i++){
// gets(ch[i]);//scanf遇到空格或者换行就结束了
//}
int max_sum = 0, min_sum = 0, number_sum = 0, speace_sum = 0, other_sum = 0;
for (i = 0; i < 3; i++){
gets(ch[i]);
for (int j = 0; ch[i][j] != ‘\0’; j++){
if (ch[i][j]>=‘a’&&ch[i][j]<= ‘z’)
min_sum++;
else if (ch[i][j]>=‘A’&&ch[i][j] <= ‘Z’)
max_sum++;
else if (ch[i][j]>=‘0’&&ch[i][j] <= ‘9’)
number_sum++;
else if (ch[i][j]==’ ')
speace_sum++;
else other_sum++;
}
}
printf(“小写字母:%d\n大写字母:%d\n数字数量:%d\n空格数量:%d\n其它字符数量:%d\n”, min_sum, max_sum,
number_sum,speace_sum, other_sum);
return 0;
}

⭐️44. 原文与密码

⭐️输入A转换为Z B<–>Y c<–>X 以此类推

//原文与密码 输入A转换为Z B<–>Y c<–>X 以此类推

int main(){
char a[30];

printf(“请输入一串字母:\n”);
gets(a);
int i = 0;
while (a[i]){
if (a[i] >= ‘a’&&a[i] <= ‘z’){
a[i] = ‘a’ + 25-(a[i] - ‘a’);
//基值’a’ +25-(差值) a[i] 若是’a’ a[i]-‘a’=0 ‘a’+25+0=z

}
if (a[i] >= ‘A’&&a[i] <= ‘Z’){
a[i] = ‘A’ + 25-(a[i] - ‘A’);
//基值’a’ +25-(差值) a[i] 若是’a’ a[i]-‘a’=0 ‘a’+25+0=z

}
i++;

}
printf(“转换之后:%s\n”, a);
return 0;
}

在这里插入图片描述

⭐️45.模拟strcat字符串连接函数

//模拟strcat字符串连接函数
void My_strcat(char *str1, char *str2){
while (*str1)str1++;//先让str1指向’\0’
while (*str1 = *str2){//把当前str2指向的字符赋值给str1指向的空间
//结束条件是*str1指向的空间被赋值了’\0’
str1++, str2++;//两个指针变量分别向后指
}
}
int main(){
char str1[20];
char str2[20];
printf(“请输入两个字符串:”);
gets(str1);
gets(str2);
My_strcat(str1, str2);
printf(“连接之后:%s\n”, str1);
return 0;
}

在这里插入图片描述

⭐️46.模拟strlen(3种方法)

⭐️方法1:计数器法

//模拟strlen
//方法1 普通式
int My_strlen(char *a){//abc
int count = 0;
while (*a != ‘\0’){//不是’\0’ count就加1
count++;
a++;
}
return count;
}
int main(){
char a[30];
printf(“请输入一个字符串:”);
gets(a);
printf(“字符串的长度是:%d\n”, My_strlen(a));
return 0;
}

⭐️方法2:指针减指针法

//方法2 指针减指针法
int My_strlen2(char *a){//abc
int *start = a;//字符串的首地址先暂存到一个指针变量里面去
while (*a != ‘\0’)a++;//在让a指向’\0’
return a - start;//指针减指针代表指针之间经历的元素个数
}
int main(){
char a[30];
printf(“请输入一个字符串:”);
gets(a);
printf(“字符串的长度是:%d\n”, My_strlen2(a));
return 0;
}

⭐️方法3:递归方法(图解)

int My_strlen3(char *a){//abc
if (*a == ‘\0’)return 0;
return 1 + My_strlen3(a + 1);
}
int main(){
char a[30];
printf(“请输入一个字符串:”);
gets(a);
printf(“字符串的长度是:%d\n”, My_strlen3(a));
return 0;
}

在这里插入图片描述

⭐️47.模拟strcmp

//模拟strcmp–两个字符串完全相等就返回0 不相等就返回*a-*b的差值
int My_strcmp(char *a, char *b){
while (*a == *b){//对应下标数的字符相等就循环
if (*a == ‘\0’)return 0;//若是有一个等于’\0’说明这两串相等
a++, b++;//++比较下一位
}
return *a - *b;//不满足循环就返回差值
}
int main(){
char a[30], b[30];
printf(“请输入2个字符串:”);
gets(a);
gets(b);
int flag = My_strcmp(a, b);
if (!flag)printf(“两个字符串是相等的–返回%d\n”,flag);
else printf(“两个字符串是不相等的–返回%d\n”,flag);
return 0;
}

在这里插入图片描述

⭐️48.模拟字符串拷贝函数strcpy

//模拟字符串拷贝函数
void My_strcpy(char *a, char *b){
while (*a++ = *b++);//先用后加 先用*a的空 和*b的内容 换句话说就是
//把*b的内容放到*a的空间中 然后a在++ b在++
}
int main(){
char a[20], b[20];
printf(“请输入一个字符串:”);
gets(b);//b字符串拷贝到a数组
My_strcpy(a, b);
printf(“拷贝到a数组之后:%s”, a);

return 0;
}

在这里插入图片描述

⭐️49.strncpy的模拟

⭐️拷贝给定的个数,若是输入的k大于b字符串长度,直接拷贝b字符串全部

//strncpy的模拟 拷贝给定的个数,若是输入的k大于b字符串长度,直接拷贝b字符串全部
void My_strncpy(char *a, char *b, int k){
while (k&&(*a=*b)){//进来先判断k值 若是0退出 或者*b赋值*a之后*a是’\0’了也退出
a++, b++;//两个指针变量指向下一个字符
k–;//拷贝的个数减1
}
if (*a != ‘\0’)*a = ‘\0’;//若拷贝了k个b数组还没有拷贝完 也就是从k=0这个条件退出的
//*a不是’\0’要把’\0’拷贝过去
}
int main(){
char a[20], b[20];
printf(“请输入一个字符串:\n”);
gets(b);//b字符串拷贝到a数组
int k = 0;
printf(“请输入拷贝的个数:\n”);
scanf(“%d”, &k);
My_strncpy(a, b, k);
printf(“拷贝到a数组之后:%s\n”, a);

return 0;
}

在这里插入图片描述

⭐️50.strncat模拟实现

在字符串str1后面追加给定的k个字符 思路就别strncpy多一步 先找到str1的’\0’在追加

//strncat模拟实现
//在字符串str1后面追加给定的k个字符 思路就别strncpy多一步 先找到str1的’\0’在追加
void My_strncat(char *str1, char *str2, int k){
while (*str1)str1++;//指向’\0’
while (k && (*str1 = *str2)){//进来先判断k值 若是0退出 或者*str2赋值*str1之后*str1是’\0’了也退出
//两个指针变量指向下一个字符
str1++, str2++;//向后指
k–;//个数-1
}
if (*str1 != ‘\0’)*str1 = ‘\0’;//若拷贝了k个str2数组还没有拷贝完 也就是从k=0这个条件退出的
// //*str1不是’\0’要把’\0’拷贝过去
}
int main(){
char str1[20];
char str2[20];
int k = 0;
printf(“请输入两个字符串:”);
gets(str1);
gets(str2);

printf(“请输入一个数:\n”);
scanf(“%d”, &k);

My_strncat(str1, str2,k);
printf(“连接之后:%s\n”, str1);
return 0;
}

在这里插入图片描述

⭐️51.模拟strncmp

⭐️比较两个字符串的前n个字符是不是相等

int My_strncmp(char *a, char*b, int k){
int t = k;
while (k&&*a == *b){
if (*a == ‘\0’){
printf(“两个字符串都遇到的’\0’ 相同 \n\n”);
return 0;
}
a++, b++;//指向下一个字符
k–;//个数–
}
if (k == 0){//若是在k=0时退出 说明前k个字符相等
printf(“前%d个字符是相同的退出\n\n”, t);
return 0;
}
else return *a - *b;//否则while循环是因为两个字符串不相等退出的返回差值
}

int main(){
char a[30], b[30];
int k;
printf(“请输入两个字符串:\n”);
gets(a);
gets(b);
printf(“请输入一个数K:\n”);
scanf(“%d”, &k);
int flag = My_strncmp(a, b,k);
if (!flag)printf(“两个字符串是相等的–返回: %d\n”, flag);
else printf(“两个字符串是不相等的–返回: %d\n”, flag);

return 0;
}

在这里插入图片描述

⭐️52.(较难些可以不看)模拟寻找子串的函数strstr

在这里插入图片描述
在这里插入图片描述

//模拟寻找子串的函数strstr
char * My_strstr(char *a, char *b){
if (*b ‘\0’)return a;//如果b数组是空数组直接返回a数组名
char *na = NULL;//内层指针
char *nb = NULL;//内层指针
while (*a){
na = a;//na每次指向下一个
nb = b;//每次nb指向b串的第一个元素
while (*nb == *na&&*na != ‘\0’&&*nb != ‘\0’){
nb++, na++;//元素相等++
}
//如果*nb
’\0’说明上面循环nb指向’\0’前面几个元素是相等的
if (*nb == ‘\0’)return a;
a++;
}
//a指向’\0’说明a不存在子串
if (*a == ‘\0’)return NULL;
}

int main(){
char a[20];//abcdef
char b[20];//abcdefj 查找a数组里面有没有bcd
printf(“请输入2个字符串:”);
gets(a);
gets(b);

char *c=My_strstr(a, b);
if (c != NULL)printf(“找的了:%s\n”, c);
else printf(“没有找的子串\n”);
return 0;
}

⭐️53.内存拷贝函数

⭐️memcpy(src,dest,size);size代表拷贝的字节数

//内存拷贝函数memcpy(src,dest,size);size代表拷贝的字节数
void My_memcpy(void *a, void *b, int sz){

char *src = (char*)a;//转化为char*可以对一个字节处理
char *dest = (char*)b;

while (sz){
*src = *dest;
src++, dest++;//向后指一的字节
sz–;//拷贝的字节数-1
}
}
int main(){
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int b[10] = { 0 };
My_memcpy(b,a,20);//20字节 int 占4字节 也就是5个元素
for (int i = 0; i < 10; i++)
printf("%d ", b[i]);
return 0;
}

在这里插入图片描述

⭐️54.判断一个数是不是素数:

//判断一个数是不是素数:
void fun(int n){
int i = 0;
for (i = 2; i < n; i++){
if (n%i == 0){
printf(“不是素数…”);
return;
}
}
if (i == n)printf(“是素数…”);
}
int main(){
int n = 0;
printf(“请输入一个数:\n”);
scanf(“%d”, &n);
fun(n);
return 0;
}

在这里插入图片描述

⭐️55.3*3矩阵的转置

//3*3矩阵的转置
void Print(int a[][3]){
int i = 0, j = 0;
for (i = 0; i < 3; i++){
for (j = 0; j < 3; j++){
printf(“%d “, a[i][j]);
}
printf(”\n”);
}
printf(“\n”);
}
int main(){
int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0, j = 0;
printf(“转置之前=============\n”);
Print(a);
//转置
for (i = 0; i < 3; i++){
for (j = 0; j < i; j++){
int t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
printf(“转置之后=============\n”);
Print(a);
return 0;
}

在这里插入图片描述

⭐️56.任何比 2 大的偶数, 总能表示两个素数,

⭐️比如 24=5+19; 5 和 19 都是素数

⭐️解释:在这里插入图片描述

int fun_(int n){
int i = 0;
for (i = 2; i < n; i++){
if (n%i == 0)return 0;
}
if (i == n)return n;
}
int main(){
int n = 0;
do{
printf(“请输入一个偶数:”);
scanf(“%d”, &n);
} while (n % 2 != 0);

int t = 2, m = n - 2;//必须是-2
//例如 1,2,3,4,5,6

// 1,2,3,4,5,6,7,8

//1,2,3,4,5,6,7,8,9,10
//左边从2开始 右边从n-2开始
while (t < n&&m >= 2){
if (fun_(t) && fun_(m)){//两个全是素数才行
printf(“%d+%d=%d”, t, m, n);
break;
}
t++, m–;//–再试
}

return 0;
}

⭐️57.输入四位数字输出四个字符

⭐️解释:在这里插入图片描述

//输入四位数字输出四个字符
//void Switch_(int num){
// if (num >= 10)Switch_(num / 10);
// printf(“%c “, num % 10 + ‘0’);
//}
//int main(){
// int num = 0;
// printf(“请输入一个数字:\n”);
// scanf(”%d”, &num);
// Switch_(num);
// return 0;
//}

在这里插入图片描述

⭐️58.把a数组的内容拷贝到b数组每拷贝三个放1个*

⭐️法1:

//把a数组的内容拷贝到b数组每拷贝三个放1个*

int main(){
char a[30];
char b[30] = { 0 };
int i = 0, j = 0;//j控制b数组下标

printf(“请输入一个字符串:”);
gets(a);
for (i = 0; a[i] != ‘\0’; i++){

b[j++] = a[i];//直接拷贝元素
if ((i + 1) % 3 == 0){
b[j++] = ‘*’;//拷贝三个就加一个*
}
}
printf(“%s”, b);
return 0;
}

⭐️法2:

//把a数组的内容拷贝到b数组每拷贝三个放1个*

int main(){
char a[30];
char b[30] = { 0 };
int i = 0, j = 0;//j控制b数组下标

printf(“请输入一个字符串:”);
gets(a);
char *p = a;
while (*p){

//拷贝3个或者*p==‘\0’是结束
for (i = 1; i <= 3 && *p != ‘\0’; i++, p++)
b[j++] = *p;//拷贝p所指向的字符串中的字符
if (*p!=’\0’)
b[j++] = ‘*’;//放一个*

}
printf(“拷贝之后: %s\n”, b);
}

在这里插入图片描述

⭐️59.输入一串字符串把其中最长的字母拷贝放到另一个数组

#include<string.h>
void FindWord(char *a, char *b){
//“1abc22hello”;

char *na = a;
while (*a){
na = a;//让na指针变量去改变
while (*na >= ‘a’&&*na <= ‘z’ || *na >= ‘A’&&*na <= ‘Z’){
na++;//向后指一个
}//退出条件:是非字母字符就退出

int flag = na - a;//指针-指针代表指针之间经历的元素个数
int len = strlen(b);//获得字符串b的长度

if (flag > len){
strncpy(b, a, flag);
}
if (*na == ‘\0’)break;//最大单词在最后 na指向了’\0’ 下面的else a = na + 1;
//就跳过去了,所以在这判断一下

if (na == a)a++;//没有进while就外层指针+1
else a = na + 1;//否则就进了,+1是因为while退出时指向了非字母字符要跳过去

}
}
int main(){
char a[256] = “1abc22hello”;
char b[256] = { 0 };//存最大单词;
printf(“请输入一个字符串:”);
gets(a);
FindWord(a, b);//找的最长的单词放到b数组
printf(“最长的单词是: %s\n”, b);
return 0;
}

在这里插入图片描述

⭐️60.16进制转换位10进制

//16进制转换位10进制
void deal(char *a){
int num = 0, i;
for (i = 0; a[i]; i++){
if (a[i] > ‘0’&&a[i] <= ‘9’){
num = num * 16 + a[i] - ‘0’;//公式记住就可
}
else if (a[i] >= ‘a’&&a[i] <= ‘f’){
num = num * 16 + a[i] - ‘a’ + 10;
}
}
printf(“转换为十进制为:%d\n”, num);
}
int main(){
char a[9];
printf(“请输入一个16进制数:\n”);
gets(a);
deal(a);
return 0;
}

在这里插入图片描述

⭐️61.输入10个整数,最大的和最后一个位置上的交换,最小的和最前面的那个交换

//输入10个整数,最大的和最后一个位置上的交换,最小的和最前面的那个交换写三个函数
void deal(int *a, int sz){

int i,max = 0, min = 0;//默认最大数和最小数在a[0]

//思路:1.首先找到最大数下标和最小数下标
//2.把最小数和a[0]交换 最大数和a[9]交换
//3.注意 先换交换 可能出现a[0]存的是最大数 你和最小数交换完之后
//最大数的下标max要指向先前的最小数下标min
for (i = 0; i < sz; i++){
if (a[max] < a[i])max = i;//max总是指向大数
if (a[min]>a[i])min = i;//min总是指向小数
}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
c8c7524780e56f2c6.png)

⭐️58.把a数组的内容拷贝到b数组每拷贝三个放1个*

⭐️法1:

//把a数组的内容拷贝到b数组每拷贝三个放1个*

int main(){
char a[30];
char b[30] = { 0 };
int i = 0, j = 0;//j控制b数组下标

printf(“请输入一个字符串:”);
gets(a);
for (i = 0; a[i] != ‘\0’; i++){

b[j++] = a[i];//直接拷贝元素
if ((i + 1) % 3 == 0){
b[j++] = ‘*’;//拷贝三个就加一个*
}
}
printf(“%s”, b);
return 0;
}

⭐️法2:

//把a数组的内容拷贝到b数组每拷贝三个放1个*

int main(){
char a[30];
char b[30] = { 0 };
int i = 0, j = 0;//j控制b数组下标

printf(“请输入一个字符串:”);
gets(a);
char *p = a;
while (*p){

//拷贝3个或者*p==‘\0’是结束
for (i = 1; i <= 3 && *p != ‘\0’; i++, p++)
b[j++] = *p;//拷贝p所指向的字符串中的字符
if (*p!=’\0’)
b[j++] = ‘*’;//放一个*

}
printf(“拷贝之后: %s\n”, b);
}

在这里插入图片描述

⭐️59.输入一串字符串把其中最长的字母拷贝放到另一个数组

#include<string.h>
void FindWord(char *a, char *b){
//“1abc22hello”;

char *na = a;
while (*a){
na = a;//让na指针变量去改变
while (*na >= ‘a’&&*na <= ‘z’ || *na >= ‘A’&&*na <= ‘Z’){
na++;//向后指一个
}//退出条件:是非字母字符就退出

int flag = na - a;//指针-指针代表指针之间经历的元素个数
int len = strlen(b);//获得字符串b的长度

if (flag > len){
strncpy(b, a, flag);
}
if (*na == ‘\0’)break;//最大单词在最后 na指向了’\0’ 下面的else a = na + 1;
//就跳过去了,所以在这判断一下

if (na == a)a++;//没有进while就外层指针+1
else a = na + 1;//否则就进了,+1是因为while退出时指向了非字母字符要跳过去

}
}
int main(){
char a[256] = “1abc22hello”;
char b[256] = { 0 };//存最大单词;
printf(“请输入一个字符串:”);
gets(a);
FindWord(a, b);//找的最长的单词放到b数组
printf(“最长的单词是: %s\n”, b);
return 0;
}

在这里插入图片描述

⭐️60.16进制转换位10进制

//16进制转换位10进制
void deal(char *a){
int num = 0, i;
for (i = 0; a[i]; i++){
if (a[i] > ‘0’&&a[i] <= ‘9’){
num = num * 16 + a[i] - ‘0’;//公式记住就可
}
else if (a[i] >= ‘a’&&a[i] <= ‘f’){
num = num * 16 + a[i] - ‘a’ + 10;
}
}
printf(“转换为十进制为:%d\n”, num);
}
int main(){
char a[9];
printf(“请输入一个16进制数:\n”);
gets(a);
deal(a);
return 0;
}

在这里插入图片描述

⭐️61.输入10个整数,最大的和最后一个位置上的交换,最小的和最前面的那个交换

//输入10个整数,最大的和最后一个位置上的交换,最小的和最前面的那个交换写三个函数
void deal(int *a, int sz){

int i,max = 0, min = 0;//默认最大数和最小数在a[0]

//思路:1.首先找到最大数下标和最小数下标
//2.把最小数和a[0]交换 最大数和a[9]交换
//3.注意 先换交换 可能出现a[0]存的是最大数 你和最小数交换完之后
//最大数的下标max要指向先前的最小数下标min
for (i = 0; i < sz; i++){
if (a[max] < a[i])max = i;//max总是指向大数
if (a[min]>a[i])min = i;//min总是指向小数
}

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-oTYzdHSW-1713294540001)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

【程序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; else if(i<=400000) bonus=bonus2+(i-200000)*0.05; else if(i<=600000) bonus=bonus4+(i-400000)*0.03; else if(i<=1000000) bonus=bonus6+(i-600000)*0.015; else bonus=bonus10+(i-1000000)*0.01; printf("bonus=%d",bonus); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值