首页
统计
友链
关于
Search
1
git操作
43 阅读
2
提交github仓库操作
17 阅读
3
C语言经典一百题(附源代码)
16 阅读
4
一篇搞定this指向问题!
9 阅读
5
JS-什么是事件循环?
7 阅读
前端
面试
算法
学习
踩坑日记
登录
Search
标签搜索
git
算法
指针原来是套娃的
累计撰写
14
篇文章
累计收到
0
条评论
首页
栏目
前端
面试
算法
学习
踩坑日记
页面
统计
友链
关于
搜索到
14
篇与
的结果
2024-08-08
项目启动一直报后端接口错误
今天开发的时候,项目需要配置后端地址,需要在hosts中添加对应的ip解析使用的SwitchHosts工具管理hosts解析配置但是一开始没有使用管理员打开,导致软件没有hosts写入权限,项目启动后找不到后端ip,报接口错误后来使用管理员权限打开后,接口还是报错,一直请求不到后端地址。重拉取项目,配置node、npm、pnpm版本后,依旧报错又感觉是vue.config.js中devServer.proxy代理配置问题,但是检查后配置没有错。突然灵机一动,打开浏览器设置清除浏览器缓存,问题完美解决。避坑!以后开发都使用无痕浏览!
2024年08月08日
4 阅读
0 评论
0 点赞
2024-07-26
提交github仓库操作
首先需要登录github,因为github会污染dns,所以需要手动配置dns解析使用管理员打开记事本 修改hosts文件打开C:\Windows\System32\drivers\etc下的hosts文件查询当前的 github iphttps://ip.tool.chinaz.com/github.com在文件末尾添加以下内容即可# GitHub520 Host Start 20.205.243.166 github.comip有可能会变化 请注意ip在github建好仓库后 使用命令提交本地内容git init git add . git commit -m "描述" git remote add origin git@github.com:imtwa/aaa.git git push -u origin master
2024年07月26日
17 阅读
0 评论
0 点赞
2024-07-24
JS-什么是事件循环?
首先,浏览器是一个多进程多线程的应用程序浏览器内部工作极其复杂,为了避免相互影响,为了减少连环崩溃的几率,当启动浏览器后,它会自动启动多个进程。可以在浏览器的任务管理器中查看当前的所有进程其中,最主要的进程有:浏览器进程主要负责界面显示、用户交互、子进程管理等。浏览器进程内部会启动多个线程处理不同的任务。网络进程负责加载网络资源。网络进程内部会启动多个线程来处理不同的网络任务。渲染进程渲染进程启动后,会开启一个渲染主线程,主线程负责执行 HTML、CSS、JS 代码。默认情况下,浏览器会为每个标签页开启一个新的渲染进程,以保证不同的标签页之间不相互影响。在渲染进程上会执行js代码,为了防止发生冲突,JavaScript被设计成了单线程的语言,意味着同一时间内只能做一件事,但是这并不意味着单线程就是阻塞,而实现单线程非阻塞的方法就是事件循环。这是一个非常巧妙的方法:在最开始的时候,渲染主线程会进入一个无限循环每一次循环会检查消息队列中是否有任务存在。如果有,就取出第一个任务执行,执行完一个后进入下一次循环;如果没有,则进入休眠状态。其他所有线程(包括其他进程的线程)可以随时向消息队列添加任务。新任务会加到消息队列的末尾。在添加新任务时,如果主线程是休眠状态,则会将其唤醒以继续循环拿取任务这样一来,就可以让每个任务有条不紊的、持续的进行下去了。若干解释何为异步?代码在执行过程中,会遇到一些无法立即处理的任务,比如:计时完成后需要执行的任务 —— setTimeout、setInterval网络通信完成后需要执行的任务 -- XHR、Fetch用户操作后需要执行的任务 -- addEventListener如果让渲染主线程等待这些任务的时机达到,就会导致主线程长期处于「阻塞」的状态,从而导致浏览器「卡死」渲染主线程承担着极其重要的工作,无论如何都不能阻塞!因此,浏览器选择异步来解决这个问题使用异步的方式,渲染主线程永不阻塞面试题:如何理解 JS 的异步?参考答案:JS是一门单线程的语言,这是因为它运行在浏览器的渲染主线程中,而渲染主线程只有一个。而渲染主线程承担着诸多的工作,渲染页面、执行 JS 都在其中运行。如果使用同步的方式,就极有可能导致主线程产生阻塞,从而导致消息队列中的很多其他任务无法得到执行。这样一来,一方面会导致繁忙的主线程白白的消耗时间,另一方面导致页面无法及时更新,给用户造成卡死现象。所以浏览器采用异步的方式来避免。具体做法是当某些任务发生时,比如计时器、网络、事件监听,主线程将任务交给其他线程去处理,自身立即结束任务的执行,转而执行后续代码。当其他线程完成时,将事先传递的回调函数包装成任务,加入到消息队列的末尾排队,等待主线程调度执行。在这种异步模式下,浏览器永不阻塞,从而最大限度的保证了单线程的流畅运行。任务有优先级吗?任务没有优先级,在消息队列中先进先出但消息队列是有优先级的根据 W3C 的最新解释:每个任务都有一个任务类型,同一个类型的任务必须在一个队列,不同类型的任务可以分属于不同的队列。在一次事件循环中,浏览器可以根据实际情况从不同的队列中取出任务执行。浏览器必须准备好一个微队列,微队列中的任务优先所有其他任务执行https://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint随着浏览器的复杂度急剧提升,W3C 不再使用宏队列的说法在目前 chrome 的实现中,至少包含了下面的队列:延时队列:用于存放计时器到达后的回调任务,优先级「中」交互队列:用于存放用户操作后产生的事件处理任务,优先级「高」微队列:用户存放需要最快执行的任务,优先级「最高」添加任务到微队列的主要方式主要是使用 Promise、MutationObserver例如:// 立即把一个函数添加到微队列 Promise.resolve().then(函数)浏览器还有很多其他的队列,由于和我们开发关系不大,不作考虑面试题:阐述一下 JS 的事件循环参考答案:事件循环又叫做消息循环,是浏览器渲染主线程的工作方式。在 Chrome 的源码中,它开启一个不会结束的 for 循环,每次循环从消息队列中取出第一个任务执行,而其他线程只需要在合适的时候将任务加入到队列末尾即可。过去把消息队列简单分为宏队列和微队列,这种说法目前已无法满足复杂的浏览器环境,取而代之的是一种更加灵活多变的处理方式。根据 W3C 官方的解释,每个任务有不同的类型,同类型的任务必须在同一个队列,不同的任务可以属于不同的队列。不同任务队列有不同的优先级,在一次事件循环中,由浏览器自行决定取哪一个队列的任务。但浏览器必须有一个微队列,微队列的任务一定具有最高的优先级,必须优先调度执行。面试题:JS 中的计时器能做到精确计时吗?为什么?参考答案:不行,因为:计算机硬件没有原子钟,无法做到精确计时操作系统的计时函数本身就有少量偏差,由于 JS 的计时器最终调用的是操作系统的函数,也就携带了这些偏差按照 W3C 的标准,浏览器实现计时器时,如果嵌套层级超过 5 层,则会带有 4 毫秒的最少时间,这样在计时时间少于 4 毫秒时又带来了偏差受事件循环的影响,计时器的回调函数只能在主线程空闲时运行,因此又带来了偏差
2024年07月24日
7 阅读
0 评论
0 点赞
2024-05-16
C语言经典一百题(附源代码)
温馨提示:本文章长达五万字,可以在网盘或github中下载源码后对照观看。网盘链接:https://pan.imtwa.top/s/YovtAJK1h9github地址:https://github.com/imtwa/c-Problem-100网盘内有文章的html和md文件,可下载后保存在本地查阅。文章已经同步在CSDN,传送链接:https://blog.csdn.net/qq_60724861/article/details/135554446前言这是在2023年12月突然萌生的一个想法,“使用各种编程语言实现经典100题”,目前准备实现c语言 c++ java python四种语言的代码编写,现在是2024年1月12日,让我们开始吧!001:无重复的三位数题目有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?思路这道题简单的做法就是使用三个循环,在最内层循环判断是否重复,不重复就打印出来。当然也能看成一个变种全排列问题,dfs深度优先搜索算法写一个简单模板就可以解决全排列问题。c++的算法库里也有全排列的函数。如果dfs不想多开数组就使用java中的方法,直接修改数组。代码实现C语言c /* 题目 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? */ #include <stdio.h> int p[4] = {1,2,3,4}; int a[4],visit[4]; int n = 4,z = 0; void dfs(int s) { int i; // 打印 if(s==n) { for(i=0; i<n-1; i++) { printf("%d ",a[i]); } printf("\n"); z++; return; } //递归调用 for(i=0; i<n; i++) { // 如果这个位置没有用过 if(!visit[i]) { visit[i]=1; // 赋值到a数组中 a[s]=p[i]; // 递归下一个位置 dfs(s+1); // 递归结束释放该位置 visit[i]=0; } } } int main() { int i, j, k; // 使用dfs深度优先算法 // dfs(0); // 使用三个变量作为下标 改变下标位置打印 for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { for (k = 0; k < n; k++) { if (p[i] != p[j] && p[i] != p[k] && p[j] != p[k]) { printf("%d %d %d\n", p[i], p[j], p[k]); z++; } } } } printf("共有%d个",z); return 0; }c++/* 题目 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? */ #include <iostream> #include <algorithm> using namespace std; int p[4] = {1,2,3,4}; int a[4],visit[4]; int n = 4,z = 0; void dfs(int s) { int i; // 打印 if(s==n) { for(i=0; i<n-1; i++) { cout<<a[i]<<" "; } cout<<endl; z++; return; } //递归调用 for(i=0; i<n; i++) { // 如果这个位置没有用过 if(!visit[i]) { visit[i]=1; // 赋值到a数组中 a[s]=p[i]; // 递归下一个位置 dfs(s+1); // 递归结束释放该位置 visit[i]=0; } } } int main() { // 调用dfs深度优先搜索算法 // dfs(0); // 使用 algorithm算法库中的全排列函数 do { cout<<p[0]<<" "<<p[1]<<" "<<p[2]<<endl; z++; } while(next_permutation(p,p+4)); cout<<"共有"<<z<<"个"<<endl; return 0; }java/* * 题目 * 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? * */ public class problem1 { public static int z = 0; public static void main(String[] args) { int[] arr = {1, 2, 3, 4}; dfs(arr, arr.length, 0); System.out.println("共有" + z + "个"); } /** * 深度优先搜索算法,用于在数组中查找并交换元素 * * @param arr 要搜索的数组 * @param size 数组的长度 * @param n 当前要处理的索引位置 */ public static void dfs(int[] arr, int size, int n) { if (n == size) { System.out.println(arr[0] + " " + arr[1] + " " + arr[2]); z++; } else { for (int i = n; i < size; i++) { //两值不相等或要执行的是它本身,则需要交换 if (arr[i] != arr[n] || i == n) { swap(arr, i, n); dfs(arr, size, n + 1); swap(arr, i, n); } } } } /** * 交换数组中指定位置的元素 * * @param arr 要交换元素的数组 * @param i 要交换的第一个元素的位置 * @param j 要交换的第二个元素的位置 */ public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }python# 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? import itertools # 导入itertools模块,用于生成排列 s = [1, 2, 3, 4] # 初始化一个空列表 # 生成列表s的所有长度为n的排列,并将结果转换为列表 num = list(itertools.permutations(s, 4)) z = len(num) # 遍历每个排列并打印 for ch in num: # 遍历排列中的每个数字并打印 for i in range(3): print(ch[i], end=' ') # 打印数字,并在数字之间添加空格(end参数指定了打印结束后的行为) print() # 打印一个换行符,开始新的一行 print(f"共有 {z} 个排列") 002:计算利润题目企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?思路这道题很多解法都是直接if else或者switch,当然这道题是理解分支结构的一道好题目,只是代码写出来太不优雅了。我们完全可以开两个数组存放利润与奖金率,根据它们的对应关系使用循环实现题目。这里需要注意c++里格式化小数的方法。代码实现C语言/* 题目: 企业发放的奖金根据利润提成。 利润(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,求应发放奖金总数? */ #include <stdio.h> double calculate_bonus(double profit) { double bonus = 0.0; if (profit <= 10) { bonus = profit * 0.1; } else if (profit <= 20) { bonus = 10 * 0.1 + (profit - 10) * 0.075; } else if (profit <= 40) { bonus = 10 * 0.1 + 10 * 0.075 + (profit - 20) * 0.05; } else if (profit <= 60) { bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (profit - 40) * 0.03; } else if (profit <= 100) { bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + (profit - 60) * 0.015; } else { bonus = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + 20 * 0.03 + 40 * 0.015 + (profit - 100) * 0.01; } return bonus; } double calc(double profit) { // 分级与奖金提成率 int p[10] = {0,10,20,40,60,100}; double b[10] = {0.1,0.075,0.05,0.03,0.015,0.01}; int i,k = 0; double bonus = 0.0; // 获得当前利润在哪个等级 for(i=0; i<6; i++) { if(profit<=p[i])break; } k = i-1; // 从高到最低计算提成 for(i=k; i>=0; i--) { // 获取在每个等级的金额数 int z = profit - p[i]; // 计算该等级的提成 bonus += z*b[i]; // 减去上一等级内容 profit -= z; } return bonus; } int main() { double profit; printf("请输入当月利润:"); scanf("%lf", &profit); // double bonus = calculate_bonus(profit); double bonus = calc(profit); printf("应发放奖金总数为:%.2lf\n", bonus); return 0; }c++/* 题目: 企业发放的奖金根据利润提成。 利润(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,求应发放奖金总数? */ #include <iostream> #include <iomanip> using namespace std; double calc(double profit) { // 分级与奖金提成率 int p[10] = {0,10,20,40,60,100}; double b[10] = {0.1,0.075,0.05,0.03,0.015,0.01}; int i,k = 0; double bonus = 0.0; // 获得当前利润在哪个等级 for(i=0; i<6; i++) { if(profit<=p[i])break; } k = i-1; // 从高到最低计算提成 for(i=k; i>=0; i--) { // 获取在每个等级的金额数 int z = profit - p[i]; // 计算该等级的提成 bonus += z*b[i]; // 减去上一等级内容 profit -= z; } return bonus; } int main() { double profit; printf("请输入当月利润:"); cin>>profit; double bonus = calc(profit); cout<<"应发放奖金总数为:"; // cout << fixed; // 加上这句话固定两位小数 即 整数1也会打印成1.00 cout<<setprecision(2)<<bonus<<endl; return 0; }003:完全平方数题目一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?思路这道题可以列公式计算,也可以通过int类型只保留整数的角度来解答,完全平方数开方后一定是一个整数,如果强转成Int和原先的值一样,则可以说明找到该数了。(1e+8为科学计数法,值为10^8)代码实现C语言/* 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? */ #include <stdio.h> #include <math.h> int main() { int i = -101; double a = -1, b = -1; while (i<1e+8) { a = sqrt(i + 100); b = sqrt(i + 100 + 168); if (a == (int)a && b == (int)b) { printf("%d\n", i); } i++; } return 0; }004:判断第几天题目输入某年某月某日,判断这一天是这一年的第几天?思路年份用来判断2月天数,其它月份1 3 5 7 10 12月为31天,最后加上几号即可。代码实现C语言/* 题目:输入某年某月某日,判断这一天是这一年的第几天? */ #include <stdio.h> int main() { int i; int n,x,y; int z=0; printf("请输入年份\n"); scanf("%d",&n); printf("请输入月份\n"); scanf("%d",&x); printf("请输入日期\n"); scanf("%d",&y); for(i=1; i<x; i++) { //计算2月的天数 if(i==2) { if(n%400 == 0 || n%4 == 0 && n%100 != 0) {// 判断闰年 z+=29; } else { z+=28; } } if(i==1||i==3||i==5||i==7||i==8||i==10||i==12) { z+=31; } else if(i!=2) { z+=30; } } z+=y; printf("%d年%d月%d号,是该年的第%d天",n,x,y,z); return 0; } 005:由小到大输出(系统排序)题目输入三个整数x,y,z,把这三个数由小到大输出。思路只是三个数的话直接互相比较也可以,不过还是用自带的排序算法比较方便。这道题我们分别了解一下C语言 c++ java python等各种语言自带的排序怎么使用。了解冒泡 选择和插入排序请看第37题(对十个数的排序)。代码实现C语言/* 题目:输入三个整数x,y,z,把这三个数由小到大输出。 */ #include <stdio.h> #include <stdlib.h> void run(int x,int y,int z) { int t; if (x > y) { t = x; x = y; y = t; } if (x > z) { t = x; x = z; z = t; } if (y > z) { t = y; y = z; z = t; } printf("%d %d %d", x, y, z); } int gg(const void* x,const void *y) { //如果需要从大到小排序则写成return *(int *)y-*(int *)x; return *(int *)x-*(int *)y; } int main() { int p[10]; int i; for(i=0; i<3; i++) { scanf("%d",p+i); } // run(p[0],p[1],p[2]); //自带排序函数 在头文件<stdlib.h>中 qsort(p,3,sizeof(p[0]),gg); for(i=0; i<3; i++) { printf("%d ",p[i]); } return 0; }006:输出字母C题目用*号输出字母C的图案。思路直接打印或者循环控制都可以代码实现C语言/* 题目:用*号输出字母C的图案。 */ #include<stdio.h> void run() { printf(" ***\n"); printf("*\n"); printf("*\n"); printf(" ***\n"); } void run2() { int i, j; int n = 10; // 控制图案的大小 for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (i == 0 || i == n - 1 || j == 0) { printf("*"); // 打印边框 } else { printf(" "); // 打印空格 } } printf("\n"); // 换行 } } int main() { // run(); run2(); return 0; } 007:输出国际象棋题目输出类似于国际象棋棋盘的图案。思路循环控制 分隔错开即可。&1和%2==0效果一样,&1是看二进制的最低位是否为1,如果是1则为奇数,0为偶数。代码实现C语言/* 题目:输出类似于国际象棋棋盘的图案。 */ #include <stdio.h> int main() { int i = 0; int j = 0; for(i = 0; i < 8; i++) { for(j = 0; j < 8; j++) if((i + j)&1) { printf(" "); } else { printf("■"); } printf("\n"); } return 0; } 008:打印九九乘法表题目输出9*9乘法表。思路这是一道经典的题目,输出九九乘法表,使用两层循环控制即可。代码实现C语言/* 输出9*9乘法表。 */ #include <stdio.h> int main(){ int i,j; for(i=1;i<=9;i++){ for(j=1;j<=i;j++){ printf("%d*%d=%d\t",j,i,i*j); } printf("\n"); } return 0; } 009:输出国际象棋棋盘题目输出国际象棋棋盘。(8行*8列)思路和第七题一样,不过这里我们使用while循环重新实现一遍。代码实现C语言/* 题目:输出国际象棋棋盘。(8行*8列) */ #include <stdio.h> int main() { int i = 8; while(i--) { int j = 8; while(j--) { if((i + j)&1) { printf(" "); } else { printf("■"); } } printf("\n"); } return 0; }010:打印楼梯题目打印楼梯,同时在楼梯上方打印两个笑脸。思路因为编码问题打印不了笑脸,用两个①代替代码实现C语言/* 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 */ #include <stdio.h> int main() { int i,j; printf("①①\n"); for(i=1; i<11; i++) { for(j=1; j<=i; j++) { printf("■■"); } printf("\n"); } return 0; }011:兔子生兔子题目古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)思路我们可以理解成第三个月以后的值,是前两个月相加,这样就清晰很多了。这道题也是动态规划的入门题目,dp[i]=dp[i-1]+dp[i-2]。代码实现C语言/* 题目:古典问题(兔子生崽): 有一对兔子,从出生后第3个月起每个月都生一对兔子, 小兔子长到第三个月后每个月又生一对兔子, 假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可) */ #include <stdio.h> void run() { int f1=1,f2=1,i; for(i=1; i<=40; i++) { if(i>=3) { //下个月是上两个月之和(从第三个月开始) int k=f1+f2; f1=f2; f2=k; } printf("第%d月有%d个\n",i,f2); } } void run1(){ int dp[40]={1,1},i; for(i=0;i<40;i++){ if(i>=2){ dp[i]=dp[i-1]+dp[i-2]; } printf("第%d月有%d个\n",i+1,dp[i]); } } int main() { // 传统做法 run(); // 动态规划做法 // run1(); return 0; }012:判断两数之间的素数题目判断101到200之间的素数。思路想要代码优雅,就多使用函数,用一个函数来判断是否是素数。我们知道,质数的定义就是他的约数只有1和它本身,所以我们用从2开始到n-1的数依次对n取余,如果可以整除的话说明它不是质数。有朴素做法,埃氏筛法,欧拉筛法等做法。这里就不对算法做过多介绍了,详情请看我之前发的文章:素数求和(筛法合集)代码实现C语言/* 判断101到200之间的素数。 */ #include <stdio.h> int vis(int n){ if(n<2)return 0; int i; for(i=2;i<n;i++){ if(n%i==0){ return 0; } } return 1; } int main() { int i,z=0; for (i=101; i<=200; i++) { if(vis(i)){ z++; printf("%d ",i); } } printf("\n共%d个",z); return 0; }013:水仙花数题目打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153 = 1的三次方+5的三次方+3的三次方。思路又是一道经典的算法,取出每一位上的数,变成立方相加后和原值比较即可。不过使用循环取最低位明显是更优雅的做法。(%10可以取出最低位上的数)代码实现C语言/* 打印出所有的"水仙花数" 所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。 例如:153是一个"水仙花数" 因为153 = 1的三次方+5的三次方+3的三次方。 */ #include <stdio.h> int vis(int n){ int x,y,z; // 取出三位 x=n%10; y=n/10%10; z=n/100%10; return n==x*x*x+y*y*y+z*z*z; } // 循环做法 int vis1(int n){ int z=0,k=n; while(n){ // 取出最低位 int t=n%10; z+=t*t*t; // 去除最低位 n/=10; } return k==z; } int main() { int i,x,y,z; for(i=100; i<1000; i++) { if(vis1(i)){ printf("%d\n",i); } } return 0; }014:分解质因数题目将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。思路对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n。重复执行。(2)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。代码实现C语言/* 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 */ #include <stdio.h> int main() { int n,i; scanf("%d",&n); printf("%d=",n); for(i=2; i<=n; i++) { while(n%i==0) { printf("%d",i); n/=i; // 如果不是最后一位 输出乘号 if(n!=1) printf("*"); } } return 0; }015:条件运算符的嵌套题目利用条件运算符的嵌套:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。思路这道题有一个小细节,就是不加括号也可以哦。(条件运算符=>(条件)?(条件满足执行这里):(条件不满足执行这里) )代码实现C语言/* 利用条件运算符的嵌套: 学习成绩>=90分的同学用A表示 60-89分之间的用B表示 60分以下的用C表示 */ #include <stdio.h> int main() { int score; char grade; scanf("%d",&score); grade = (score>=90) ? 'A' : ( (score>=60) ? 'B' : 'C' ); // grade = score>=90 ? 'A' : score>=60 ? 'B' : 'C'; printf("%c\n",grade); return 0; }016:最大公约数与最小公倍数题目输入两个正整数m和n,求其最大公约数和最小公倍数。思路简单算法就是从n到1,找能被两个数整除的数,找到就是最大公约数,再从n到n*m找能整除两数的数,找到就是最小公倍数。还有就是欧几里得算法求解最大公约数(gcd),最小公倍数(lcm)和gcd有关系,gcd*lcm=n*m;知道最大公约数就能算最小公倍数了。这里不多介绍算法,详见代码。代码实现C语言/* 输入两个正整数m和n,求其最大公约数和最小公倍数。 */ #include <stdio.h> //普通算法求解 void run(int n,int m) { int i; for(i=n; i>=1; i--) { if(n%i==0&&m%i==0) { printf("gcd=%d\n",i); break; } } for(i=n; i<=n*m; i++) { if(i%n==0&&i%m==0) { printf("lcm=%d\n",i); break; } } } //辗转相除法求解 void run1(int n,int m) { int t,r,a=n,b=m; //为了确保是大数除小数 if (m<n) { t=m; m=n; n=t; } //辗转相除 while((m%n)!=0) { r=m%n; m=n; n=r; }; int gcd = n; int lcm = a*b/gcd; printf("gcd=%d\nlcm=%d",gcd,lcm); } // 位运算求解 void run2(int x, int y) { int a=x,b=y; /* gcd(a,b) = gcd(b,a mod b) #首先声明^就是异或,a^a=0,a^0=a其次连等是从右往左结合 x1=x%y; y1=y^x1=y^(x%y) x2=x1^y1=(x%y)^y^(x%y)=y y2=y1^x2=y^(x%y)^y=x%y 即: x'=y, y'=x%y gcd(x,y) = gcd(y,x%y) = gcd(x',y') */ while(y^=x^=y^=x%=y); int gcd = x; int lcm = a*b/gcd; printf("gcd=%d\nlcm=%d",gcd,lcm); } int main() { int n,m; scanf("%d %d",&n,&m); run(n,m); return 0; }017:字符统计题目输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。思路直接if判断即可,输入一个字符就判断一个字符,到回车('\n')停止。注意字符是用单引号。代码实现C语言/* 输入一行字符 分别统计出其中英文字母、空格、数字和其它字符的个数。 */ #include <stdio.h> int main() { char c; int letters=0,spaces=0,digits=0,others=0; while((c=getchar())!='\n') { if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) letters++; else if(c>='0'&&c<='9') digits++; else if(c==' ') spaces++; else others++; } printf("字母=%d,数字=%d,空格=%d,其他=%d\n",letters,digits,spaces,others); return 0; }018:数字序列求和题目求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。思路这也是一道经典题目,详见代码。代码实现C语言/* 求s=a+aa+aaa+aaaa+aa...a的值 其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加) 几个数相加由键盘控制。 */ #include <stdio.h> int main() { int z=0,a=2,n,t; scanf("%d",&n); while(n) { t+=a;// 这里的t在循环中变成了2 22 222 z+=t; a=a*10; n--; } printf("a+aa+...=%d\n",z); return 0; }019:寻找完数题目一个数如果恰好等于它的真因子之和,这个数就称为"完数"。例如6=1+2+3。编程找出1000以内的所有完数。思路寻找因子相加即可,这里将因子放到了数组里面,方便打印公式。代码实现C语言/* 一个数如果恰好等于它的真因子之和,这个数就称为"完数"。 例如6=1+2+3。编程找出1000以内的所有完数。 */ #include <stdio.h> int main() { int i,j,n; int a[256]; for(i=2; i<=1000; i++) { int sum=0,k=0; for(j=1; j<i; j++) { if(i%j==0) { sum+=j; a[k++]=j; } } if(i==sum) { printf("%d=%d",i,a[0]); for(n=1; n<k; n++) printf("+%d",a[n]); printf("\n"); } } return 0; }020:自由落体的小球题目一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?思路又是一道经典算法,第一次经过的是从高到低一次,后面都是从低到高再从高到低两次。代码实现C语言/* 一球从100米高度自由落下,每次落地后反跳回原高度的一半; 再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? */ #include <stdio.h> int main() { float h=100,s=0; int i; for(i=1; i<=10; i++) { if(i==1) { s=s+h; } else { s=s+2*h; } h=h/2; printf("第%d次落地时,共经过%f米,第%d次反弹高%f米\n",i,s,i,h); } return 0; }021:猴子吃桃题目猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少。思路经典题目+1,这个向前反推即可。代码实现C语言/* 猴子吃桃问题: 猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。 以后每天早上都吃了前一天剩下的一半零一个。 到第10天早上想再吃时,只剩下一个桃子了。 求第一天共摘了多少。 */ #include <stdio.h> int main() { int day = 10, x1 = 0, x2 = 1; while(day) { printf("第%d天还有%d个\n",day,x2); x1=(x2+1)*2; // 第一天的桃子数是第2天桃子数加1后的2倍 x2=x1; day--; } return 0; }022:比赛名单题目两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。思路这是一道无语的题目。代码实现C语言/* 两个乒乓球队进行比赛,各出三人。 甲队为a,b,c三人,乙队为x,y,z三人。 已抽签决定比赛名单。有人向队员打听比赛的名单。 a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。 */ #include <stdio.h> int main() { char i,j,k; for(i='x'; i<='z'; i++) { for(j='x'; j<='z'; j++) { if(i!=j) { for(k='x'; k<='z'; k++) { if(i!=k&&j!=k) { if(i!='x'&&k!='x'&&k!='z') { printf("顺序为:a--%c\tb--%c\tc--%c\n",i,j,k); } } } } } } }023:打印菱形题目打印出如下图案(菱形)。*************************思路又是一道经典,看我代码,有简单解法哦。代码实现C语言/* 打印出如下图案(菱形)。 */ #include <stdio.h> #include <stdlib.h> void run(int n) { int i,j; for( i=-n/2; i<=n/2; i++) { for(j=1; j<=abs(i); j++) printf(" "); for(j=1; j<=n-abs(i*2); j++) printf("*"); printf("\n"); } } void run1(int n) { int i,j,k; for(i=1; i<=n/2+1; i++) { for(j=1; j<=n/2+1-i; j++) printf(" "); for(k=1; k<=2*i-1; k++) printf("*"); printf("\n"); } for(i=1; i<=n/2; i++) { for(j=1; j<=i; j++) printf(" "); for(k=1; k<=n-2*i; k++) printf("*"); printf("\n"); } } int main() { run(7); // run1(7); }024:分数序列求和题目有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。思路这道真的是经典,很多学校很爱出这道题。代码实现C语言/* 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13... 求出这个数列的前20项之和。 */ #include <stdio.h> int main() { int i,t; float sum=0; float a=2,b=1; for(i=1; i<=20; i++) { sum=sum+a/b; t=a; a=a+b; b=t; } printf("%9.6f\n",sum); }025:阶乘求和题目求1+2!+3!+...+20!的和。思路经典题目又又又又+1代码实现C语言/* 求1+2!+3!+...+20!的和。 */ #include <stdio.h> int main() { int i; double sum=0,mix=1; for(i=1; i<=20; i++) { mix=mix*i;//mix为1! 2! 3!... sum=sum+mix; } printf("%lf\n",sum); }026:递归求阶乘题目利用递归方法求5!思路递归比较消耗栈的空间,求到20!或者再多点就会爆内存,一般还是不用递归求阶乘比较好。代码实现C语言/* 利用递归方法求5! */ #include <stdio.h> int fact(int n) { if(n==0) { return 1; } return n*fact(n-1); } int main() { int i; int fact(int); for(i=0; i<6; i++) { printf("%d!=%d\n",i,fact(i)); } } 027:递归字符反转题目利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。思路用这道题理解递归更好哦。代码实现C语言/* 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。 */ #include <stdio.h> void rvs(char *s){ if(*s=='\0'){ return; } rvs(s+1); printf("%c",*s); } int main() { char s[10]; scanf("%s",s); rvs(s); }028:计算岁数题目有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?思路这道题也可以用递归做,你想到了嘛。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。代码实现C语言/* 有5个人坐在一起,问第五个人多少岁? 他说比第4个人大2岁。 问第4个人岁数,他说比第3个人大2岁。 问第三个人,又说比第2人大两岁。 问第2个人,说比第一个人大两岁。 最后问第一个人,他说是10岁。请问第五个人多大? */ #include <stdio.h> int age1(int n) { if(n==1){ return 10; } return age1(n-1)+2; } int age2(){ int i,z=10; for(i=1;i<5;i++){ printf("第%d个人%d岁\n",i,z); z+=2; } return z; } int main() { printf("第%d个人%d岁\n",5,age1(5)); }029:数字逆序题目给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。思路用%10依次获得最低位即可。代码实现C语言/* 给一个不多于5位的正整数 要求:一、求它是几位数,二、逆序打印出各位数字。 */ #include <stdio.h> void run1(int n){ int k=0; while(n){ printf("%d",n%10); n/=10; k++; } printf("这是%d位数",k); } void run2(int n){ int k=0,a=n; while(n){ n/=10; k++; } printf("这是%d位数,逆序为",k); while(a){ printf("%d",a%10); a/=10; } } int main( ) { int n; scanf("%d",&n); run2(n); }030:判断回文数题目一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。思路回文数倒看和它也相等。当然如果当成字符串看更简单哦。代码实现C语言/* 一个5位数,判断它是不是回文数。 即12321是回文数,个位与万位相同,十位与千位相同。 */ #include <stdio.h> #include <string.h> // 判断数字是否回文 // 12321倒看也等于12321 int vis1(int n) { int a=n,s=0; while(a) { s=s*10+a%10; a=a/10; } return n==s; } // 当成字符串检测 int vis2(char *s) { int i=0,j=strlen(s)-1; while(i<j) { if(s[i]!=s[j]) { return 0; } i++; j--; } return 1; } int main() { int n; scanf("%d",&n); printf(vis1(n)?"%d是回文数":"%d不是回文数",n); // char s[10]; // scanf("%s",s); // printf(vis2(s)?"%s是回文数":"%s不是回文数",s); }031:判断星期几题目请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。思路这道题挨个判断很麻烦,不如直接判断。注意getchar吸收回车代码实现C语言/* 请输入星期几的第一个字母来判断一下是星期几 如果第一个字母一样,则继续判断第二个字母。 */ #include <stdio.h> int main() { char i,j; printf("请输入第一个字母:\n"); scanf("%c",&i); // scanf("%c",&j);的问题,第二次是读入的一个换行符,而不是输入的字符 // 因此需要加一个getchar() 吃掉换行符 getchar(); switch(i) { case 'm': printf("monday\n"); break; case 'w': printf("wednesday\n"); break; case 'f': printf("friday\n"); break; case 't': printf("请输入下一个字母\n"); scanf("%c",&j); if (j=='u') { printf("tuesday\n"); break; } if (j=='h') { printf("thursday\n"); break; } case 's': printf("请输入下一个字母\n"); scanf("%c",&j); if (j=='a') { printf("saturday\n"); break; } if (j=='u') { printf("sunday\n"); break; } default : printf("error\n"); break; } return 0; }032:删除指定字符题目删除一个字符串中的指定字母,如:字符串 "aca",删除其中的 a 字母。思路用指向下标的变量修改数组内容。代码实现C语言/* 删除一个字符串中的指定字母 如:字符串 "aca",删除其中的 a 字母。 */ #include <stdio.h> // 删除字符串中指定字母函数 char* deleteCharacters(char * str, char charSet) { int i,j=0; for(i = 0; str[i]!='\0'; i++) { if(str[i]!=charSet) { str[j++]=str[i]; } } str[j] = '\0'; return str; } int main() { char c = 'a'; // 要删除的字母 char s[10] = "aca"; // 目标字符串 deleteCharacters(s, c); printf("%s\n", s); return 0; }033:判断素数题目判断一个数字是否为质数(素数)。思路和第12题一样。代码实现C语言/* 判断一个数字是否为质数(素数)。 */ #include <stdio.h> int vis(int n) { if(n<2)return 0; int i; for(i=2; i<n; i++) { if(n%i==0) { return 0; } } return 1; } int main() { int n; scanf("%d",&n); printf(vis(n)?"%d是素数":"%d不是素数",n); return 0; } 034:函数调用题目练习函数调用。在函数内调用函数。思路在函数内调用函数就好啦。代码实现C语言/* 练习函数调用。在函数内调用函数。 */ #include <stdio.h> void hello_world(void) { printf("Hello, world!\n"); } void three_hellos(void) { int counter; for (counter = 1; counter <= 3; counter++) hello_world();/*调用此函数*/ } int main() { three_hellos();/*调用此函数*/ return 0; }035:字符串反转题目字符串反转,如将字符串 "abcde" 反转为 "edcba"。思路双指针,一个指向头一个指向最后,依次进行交换。代码实现C语言/* 字符串反转,如将字符串 "abcde" 反转为 "edcba"。 */ #include <stdio.h> #include <string.h> char* rvs(char *s){ int i=0,j=strlen(s)-1; while(i<j){ char c=s[i]; s[i]=s[j]; s[j]=c; i++; j--; } return s; } int main() { char s[10] = "abcde"; rvs(s); printf("%s",s); }036:100以内的素数题目求100之内的素数。思路这是第三次出现素数了,素数的知识点很重要。代码实现C语言/* 求100之内的素数。 */ #include <stdio.h> int vis(int n) { if(n<2)return 0; int i; for(i=2; i<n; i++) { if(n%i==0) { return 0; } } return 1; } int main() { int i,z=0; for (i=0; i<=100; i++) { if(vis(i)) { z++; printf("%d ",i); } } printf("\n共%d个",z); return 0; }037:对十个数排序题目对10个数进行排序。思路和第5题很像,第5题介绍了系统排序,这里我们用最经典的三大排序 冒泡排序 选择排序和插入排序实现一遍。了解十大排序请看菜鸟教程:十大经典排序算法代码实现C语言/* 对10个数进行排序 */ #include <stdio.h> /* 冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。 这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 */ void bubble_sort(int arr[], int len) { int i, j, temp; for (i = 0; i < len - 1; i++) { for (j = 0; j < len - 1 - i; j++) { // 将大的数放到后面 if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } /* 选择排序 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。 重复第二步,直到所有元素均排序完毕。 */ void selection_sort(int arr[], int len) { int i,j,temp; for (i = 0 ; i < len - 1 ; i++) { int min = i; //走访未排序的元素 for (j = i + 1; j < len; j++) { //找到目前最小值 if (arr[j] < arr[min]) { min = j; } } temp = arr[min]; arr[min] = arr[i]; arr[i] = temp; } } /* 插入排序 将第一待排序序列第一个元素看做一个有序序列 把第二个元素到最后一个元素当成是未排序序列。 从头到尾依次扫描未排序序列 将扫描到的每个元素插入有序序列的适当位置。 如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。 */ void insertion_sort(int arr[], int len) { int i, j, key; for (i = 1; i < len; i++) { key = arr[i]; for (j = i - 1; j >= 0 && arr[j] > key; j--) { arr[j + 1] = arr[j]; } arr[j + 1] = key; } } int main() { int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 }; int len = sizeof(arr) / sizeof(arr[0]); bubble_sort(arr, len); // selection_sort(arr, len); // insertion_sort(arr, len); int i; for (i = 0; i < len; i++) { printf("%d ", arr[i]); } return 0; }038:对角线元素之和题目求一个3*3矩阵对角线上的元素之和。思路经典题目+1,找出对角线上的规律即可。对于对角线上有 i=j;对于副对角线有 i+j=4;这道题没有明说,我看其它解法都是按照主对角线做的。进阶题目&详解请看:1115: DNA(二维数组思想)代码实现C语言/* 求一个3*3矩阵对角线元素之和 */ #include <stdio.h> #define N 3 int main() { int i,j,a[N][N],sum=0; printf("请输入矩阵(3*3):\n"); for(i=0; i<N; i++){ for(j=0; j<N; j++){ scanf("%d",&a[i][j]); } } for(i=0; i<N; i++){ sum+=a[i][i]; } printf("对角线之和为:%d\n",sum); return 0; }039:插入数组题目有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。思路分成两步 一个是找到它的位置 另一个是将后面的数后移让出位置。代码实现C语言/* 有一个已经排好序的数组。 现输入一个数,要求按原来的规律将它插入数组中。 */ #include <stdio.h> int main() { int a[11]= {1,4,6,9,13,16,19,28,40,100}; int i,j,num=10; printf("原始数组是:\n"); for(i=0; i<10; i++) { printf("%4d",a[i]); } printf("\n插入一个新的数字: %d\n",num); // 找到位置 for(i=0; i<10; i++) { if(num<a[i])break; } // 后移位置 for(j=10; j>=i; j--) { a[j]=a[j-1]; } // 插入 a[i]=num; printf("插入后的数组是:\n"); for(i=0; i<11; i++) { printf("%4d",a[i]); } return 0; }040:数组逆序题目将一个数组逆序后输出。思路和第35题是不是很像?照做即可!代码实现C语言/* 将一个数组逆序后输出。 */ #include <stdio.h> #define N 10 int main() { int a[N]= {0,1,2,3,4,5,6,7,8,9}; int i,j,t; printf("原始数组是:\n"); for(i=0; i<N; i++) printf("%d ",a[i]); for(i=0,j=N-1; i<j; i++,j--) { t=a[i]; a[i]=a[j]; a[j]=t; } printf("\n逆序后的数组:\n"); for(i=0; i<N; i++) printf("%d ",a[i]); printf("\n"); return 0; }041:static静态变量题目学习static定义静态变量的用法。思路当一个局部变量被声明为static时,它的生命周期会延长到整个程序执行期间,而不是仅仅在定义它的代码块内。这意味着,即使该函数已经返回,该变量的值仍然保持不变。代码实现C语言/* 学习static定义静态变量的用法。 */ #include <stdio.h> void f() { int i = 0; static int si = 0; i++; si++; printf("i=%d\n", i); printf("static si = %d\n", si); } int main() { int i; for (i = 0; i < 4; i++) { f(); } return 0; } 042:auto用法题目学习使用auto定义变量的用法。思路auto关键字用于声明一个变量的存储类型为自动存储类型。即数据类型由编译器自己确定。这道题后部分要和43题一块看。代码实现C语言/* 学习使用auto定义变量的用法。 */ #include <stdio.h> int main() { int cnt = 5,i; for (i = 0; i < 4; i++) { printf("cnt 变量为 %d\n", cnt); cnt++; { // auto关键字用于声明一个变量的存储类型为自动存储类型 // 可以简化变量声明,让编译器自己确定变量的存储类型 auto cnt = 1; // 优先使用生存域小的变量 // 下一次循环该变量被重新定义 printf("内置模块 cnt 变量为 %d\n", cnt); cnt++; } } return 0; }043:static另一种用法题目学习使用static的另一用法。思路static的变量只初始化一次 并且一直存活(但只能在自己的作用域里使用)代码实现C语言/* 学习使用static的另一用法。 */ #include <stdio.h> int main() { int cnt = 5,i; for (i = 0; i < 4; i++) { printf("cnt 变量为 %d\n", cnt); cnt++; { static int cnt = 1; printf("内置模块 cnt 变量为 %d\n", cnt); cnt++; } } return 0; }044:全局变量用法题目学习使用external的用法。思路全局变量全局可用。代码实现C语言/* 学习使用external的用法。(全局变量) */ #include <stdio.h> int a=2, b=2, c; void add() { int a; a = 1;// 这里使用的是函数内部的a c = a + b;// 这里是1 + 2 } int main() { add(); printf("c = %d\n", c); return 0; }045:register用法题目学习使用register定义变量的方法。思路在早期版本中,可以使用register关键字来建议编译器将变量存储在寄存器中,以提高性能。然而,由于现代编译器已经能够自动优化性能,因此使用register已经不再推荐。代码实现C语言/* 学习使用register定义变量的方法。 */ #include <stdio.h> int main() { register int i;//将变量i存储在寄存器中 int sum = 0; for (i = 0; i <= 10; i++) { sum += i; } printf("%d\n", sum); return 0; }046:宏命令练习一题目宏#define命令练习思路在C语言中,宏定义是一种预处理指令,用于创建宏。宏是一种文本替换机制,它允许程序员使用一个符号(宏名)来表示一个字符串(宏的替换文本)。在预处理阶段,编译器会用宏的替换文本替换程序中的宏名。代码实现C语言/* 宏#define命令练习 */ #include <stdio.h> #define TRUE 1 #define FALSE 0 #define SQ(x) (x)*(x) int main() { int num; int flag = 1; //num < 20 程序将终止 while (flag) { scanf("%d", &num); printf("该数的平方为 %d \n", SQ(num)); if (num >= 20) flag = TRUE; else flag = FALSE; } return 0; }047:宏命令练习二题目对宏命令实现函数功能代码实现C语言/* 对宏命令实现函数功能 */ #include <stdio.h> #define exchange(a,b) { int t;t=a;a=b;b=t;}//注意放在一行里 int main() { int x = 5; int y = 10; printf("x=%d; y=%d\n", x, y); exchange(x, y); printf("x=%d; y=%d\n", x, y); return 0; }048:宏命令练习三题目理解宏命令和函数的区别思路宏命令 只是在编译之前实现预编译替换!!注意,在宏定义中,参数必须用括号括起来,以避免因为运算符优先级引起的错误。例如,如果没有在参数周围使用括号,以下宏定义可能会导致错误。代码实现C语言/* 理解宏命令和函数的区别 */ #include <stdio.h> #define f(a,b) a*b //正确做法 //#define f(a,b) (a)*(b) int f1(int a,int b){ return a*b; } int main() { printf("%d\n", f(5+5,5+5));//得35 这里实际为5+5*5+5 宏定义只会实现替换 printf("%d\n", f1(5+5,5+5));//得100 自动加好 return 0; }049:#if #ifdef #ifndef综合应用题目if #ifdef和#ifndef的综合应用思路这段C语言代码演示了预处理器宏(macros)的使用,特别是条件编译。让我们逐步分析这段代码:定义了两个宏函数:MAXIMUM 和 MINIMUM。这两个函数用于返回两个参数中的最大值和最小值。#define MAXIMUM(x,y) (x>y)?x:y#define MINIMUM(x,y) (x>y)?y:x在main函数中,定义了两个整数变量a和b,并分别赋值为10和20。接下来的部分使用了条件编译。#ifdef MAX检查是否定义了MAX宏。如果定义了,它会打印出a和b中的最大值。否则,它会打印出a和b中的最小值。#ifdef MAXprintf("w 大 %d\n", MAXIMUM(a, b));#elseprintf("w 小 %d\n", MINIMUM(a, b));#endif接下来的部分与上面的部分类似,但是它检查是否定义了MIN宏:#ifndef MINprintf("x 小 %d\n", MINIMUM(a, b));#elseprintf("x 大 %d\n", MAXIMUM(a, b));#endif接下来,MAX宏被取消定义:#undef MAX再次检查MAX宏是否被定义,这次它应该没有被定义,所以会打印出a和b中的最小值。最后,定义了MIN宏,并再次检查它是否被定义。这次,它会打印出a和b中的最大值。main函数返回0,程序结束。当你运行这段代码时,输出将是:w 小 10x 大 20y 小 10z 大 20这是条件编译代码实现C语言/* #if #ifdef和#ifndef的综合应用 */ #include <stdio.h> #define MAX #define MAXIMUM(x,y) (x>y)?x:y #define MINIMUM(x,y) (x>y)?y:x int main() { int a = 10, b = 20; #ifdef MAX printf("w 大 %d\n", MAXIMUM(a, b)); #else printf("w 小 %d\n", MINIMUM(a, b)); #endif #ifndef MIN printf("x 小 %d\n", MINIMUM(a, b)); #else printf("x 大 %d\n", MAXIMUM(a, b)); #endif #undef MAX #ifdef MAX printf("y 大 %d\n", MAXIMUM(a, b)); #else printf("y 小 %d\n", MINIMUM(a, b)); #endif #define MIN #ifndef MIN printf("z 小 %d\n", MINIMUM(a, b)); #else printf("z 大 %d\n", MAXIMUM(a, b)); #endif return 0; }050:.h文件和.c文件引用题目使用#include导入.h和.c文件思路注意<>和""的区别 <>在系统的文件中寻找,""在用户的文件中寻找 没找到再去找系统的文件。代码实现C语言50.hint mmax(int a,int b){ return a>b?a:b; }50.c/* 使用#include导入.h和.c文件 */ #include <stdio.h> #include "50.h" int main() { int a=10,b=5; printf("大的数是%d",mmax(a,b)); return 0; }051:按位与题目学习按位与&思路全1得1代码实现C语言/* 学习使用按位与 & 0&0=0; 0&1=0; 1&0=0; 1&1=1 。 全1得1 */ #include <stdio.h> int main() { int a,b; a=7; // 7的二进制为0111 b=a&3; // 3的二进制为0011 &得到0011(3) printf("a & b(decimal) 为 %d \n",b); b&=0; // 0000&0011 = 0000 printf("a & b(decimal) 为 %d \n",b); return 0; }052:按位或题目学习按位或|思路有1得1 代码实现C语言/* 学习使用按位或 | 0|0=0; 0|1=1; 1|0=1; 1|1=1 。 有1得1 */ #include <stdio.h> int main() { int a,b; a=7; b=a|3; //0111|0011 = 0111 printf("b 的值为 %d \n",b); b|=0; //0111|0000 = 0111 printf("b 的值为 %d \n",b); return 0; }053:按位异或题目学习按位异或思路相异得1 性质:a^0=a a^a=0 代码实现C语言/* 学习使用按位异或 ^ 0^0=0; 0^1=1; 1^0=1; 1^1=0 相异得1 性质:a^0=a a^a=0 */ #include <stdio.h> int main() { int a,b; a=7; b=a^3; //0111^0011 = 0100(4) printf("b 的值为 %d \n",b); b^=0; //0100^0000 = 0100(4) printf("b 的值为 %d \n",b); return 0; }054:取二进制中的某几位题目取一个整数 a 从右端开始的 4~7 位思路(1)先使 a 右移 4 位。 (2)设置一个低 4 位全为 1,其余全为 0 的数,可用~(~0<<4) (3)将上面二者进行 & 运算。做法二 创建一个4-7位为1 其余位为0的数 与a做与运算 然后整体右移四位 代码实现C语言/* 取一个整数 a 从右端开始的 4~7 位 程序分析: (1)先使 a 右移 4 位。 (2)设置一个低 4 位全为 1,其余全为 0 的数,可用~(~0<<4) (3)将上面二者进行 & 运算。 */ #include <stdio.h> void run(){ // 做法二 创建一个4-7位为1 其余位为0的数 与a做与运算 然后整体右移四位 int a=0b1110010011,b=0,d,i; for(i=4;i<=7;i++){ b+=1<<i; } //此时b为 0000 1111 0000(240) //a&b = 0011 1001 0011 & 0000 1111 0000 =0000 1001 0000 //>>4 = 0000 1001(9) d=(a&b)>>4; printf("a=%d\nd=%d\n",a,d); } int main() { //0b开头转为二进制储存 0x十六进制 0八进制 不加默认十进制 int a=0b1110010011,b,c,d;//0011 1001 0011(915) b=a>>4; //b=0011 1001(a整体右移四位 低位舍去) // 优先级为~((~0)<<4) // ~0=1111 1111(全1) ~0<<4为1111 0000(低四位为0) c=~(~0<<4); //c=0000 1111(取反后 低四位为1 其余位为0) d=b&c; //0011 1001 & 0000 1111 = 0000 1001(9) printf("a=%d\nd=%d\n",a,d); // run(); return 0; }055:按位取反题目学习使用按位取反~思路数字在计算机里面都是用二进制补码储存 代码实现C语言/* 学习使用按位取反~ ~0=1; ~1=0; 数字在计算机里面都是用二进制补码储存 */ #include <stdio.h> int main() { int a,b; a=0b0011; b=~a; // b=1100(此时为补码形式)转为源码 //(补码最高位为符号位 剩余位取反后+1) 1,100(-4) printf("a 的按位取反值为(十进制) %d \n",b); a=~a;// -4 源码为-0000 0100 转为补码(源码取反后+1)1111 1100 (fc) printf("a 的按位取反值为(十六进制) %x \n",a); return 0; }056:画圆形题目画图,学用circle画圆形。思路先在https://www.easyx.cn/ 下载安装EasyX库代码实现C语言#include <easyx.h> // 引用图形库头文件 #include <conio.h> int main() { initgraph(640, 480); // 创建绘图窗口,大小为 640x480 像素 circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100 _getch(); // 按任意键继续 closegraph(); // 关闭绘图窗口 }057:画直线题目画图,学用line画直线。代码实现C语言#include <graphics.h> #include <conio.h> void main() { initgraph(640, 480); // 画一条直线 line(0, 0, 300, 300); // 按任意键继续 getch(); closegraph(); }058:画矩形题目学用rectangle画矩形。代码实现C语言#include <graphics.h> #include <conio.h> void main() { initgraph(640, 480); // 绘制矩形框 rectangle(50, 50, 550, 400); // 按任意键继续 getch(); closegraph(); }059:画图综合一题目画图,综合例子。代码实现C语言#include <graphics.h> #include <time.h> #include <conio.h> int main() { // 设置随机函数种子 srand((unsigned)time(NULL)); // 初始化图形模式 initgraph(640, 480); int x, y; char c; settextstyle(16, 8, _T("Courier")); // 设置字体 // 设置颜色 settextcolor(GREEN); setlinecolor(BLACK); for (int i = 0; i <= 479; i++) { // 在随机位置显示三个随机字母 for (int j = 0; j < 3; j++) { x = (rand() % 80) * 8; y = (rand() % 20) * 24; c = (rand() % 26) + 65; outtextxy(x, y, c); } // 画线擦掉一个像素行 line(0, i, 639, i); Sleep(10); // 延时 if (i >= 479) i = -1; // 循环处理 if (_kbhit()) break; // 按任意键退出 } // 关闭图形模式 closegraph(); }060:画图综合二题目画图,综合例子2。代码实现C语言#include <graphics.h> #include <time.h> #include <conio.h> #define MAXSTAR 200 // 星星总数 struct STAR { double x; int y; double step; int color; }; STAR star[MAXSTAR]; // 初始化星星 void InitStar(int i) { star[i].x = 0; star[i].y = rand() % 480; star[i].step = (rand() % 5000) / 1000.0 + 1; star[i].color = (int)(star[i].step * 255 / 6.0 + 0.5); // 速度越快,颜色越亮 star[i].color = RGB(star[i].color, star[i].color, star[i].color); } // 移动星星 void MoveStar(int i) { // 擦掉原来的星星 putpixel((int)star[i].x, star[i].y, 0); // 计算新位置 star[i].x += star[i].step; if (star[i].x > 640) { InitStar(i); } // 画新星星 putpixel((int)star[i].x, star[i].y, star[i].color); } // 主函数 int main() { srand((unsigned)time(NULL)); // 随机种子 initgraph(640, 480); // 创建绘图窗口 // 初始化所有星星 for (int i = 0; i < MAXSTAR; i++) { InitStar(i); star[i].x = rand() % 640; } // 绘制星空,按任意键退出 while (!_kbhit()) { for (int i = 0; i < MAXSTAR; i++) { MoveStar(i); } Sleep(20); } closegraph(); // 关闭绘图窗口 }061:杨辉三角题目打印出杨辉三角形,10行。格式如下:**1 1 1 1 2 1 1 3 3 1 1 4 6 4 1**思路除1外 其它地方值为它左上角+正上方的值相加 代码实现C语言/* 题目:打印出杨辉三角形(要求打印出10行)。 结构如下所示: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 除1外 其它地方值为它左上角+正上方的值相加 */ #include <stdio.h> int main() { int i,j; int a[10][10]; // 让最左边和对角线上值为1 for(i=0; i<10; i++) { a[i][0]=1; a[i][i]=1; } // 赋值其它地方 值为它左上角+正上方的值相加 for(i=2; i<10; i++) for(j=1; j<i; j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; // 打印 for(i=0; i<10; i++) { for(j=0; j<=i; j++) printf("%5d",a[i][j]); printf("\n"); } }062:画点题目学习putpixel画点。 代码实现C语言#include <graphics.h> #include <conio.h> void main() { initgraph(800, 600); for (int i = 0; i < 500; ++i) { for (int j = 0; j < 300; ++j) { putpixel(i, j, RED); } } getch(); closegraph(); }063:画椭圆题目画椭圆ellipse。代码实现C语言#include <graphics.h> #include <conio.h> void main() { initgraph(800, 600); setfillcolor(GREEN); fillellipse(100, 100, 300, 500); getch(); closegraph(); }064:鼠标操作题目EasyX 鼠标操作范例代码实现C语言#include <graphics.h> #include <conio.h> int main() { // 初始化图形窗口 initgraph(640, 480); MOUSEMSG m; // 定义鼠标消息 while (true) { // 获取一条鼠标消息 m = GetMouseMsg(); switch (m.uMsg) { case WM_MOUSEMOVE: // 鼠标移动的时候画红色的小点 putpixel(m.x, m.y, RED); break; case WM_LBUTTONDOWN: // 如果点左键的同时按下了 Ctrl 键 if (m.mkCtrl) // 画一个大方块 rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10); else // 画一个小方块 rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5); break; case WM_RBUTTONUP: return 0; // 按鼠标右键退出程序 } } // 关闭图形窗口 closegraph(); }065:色彩模型题目HSL色彩模型的应用范例。代码实现C语言#include <graphics.h> #include <conio.h> int main() { // 创建绘图窗口 initgraph(640, 480); // 画渐变的天空(通过亮度逐渐增加) float H = 190; // 色相 float S = 1; // 饱和度 float L = 0.7f; // 亮度 for (int y = 0; y < 480; y++) { L += 0.0005f; setlinecolor(HSLtoRGB(H, S, L)); line(0, y, 639, y); } // 画彩虹(通过色相逐渐增加) H = 0; S = 1; L = 0.5f; setlinestyle(PS_SOLID, 2); // 设置线宽为 2 for (int r = 400; r > 344; r--) { H += 5; setlinecolor(HSLtoRGB(H, S, L)); circle(500, 480, r); } // 按任意键退出 _getch(); closegraph(); }066:数字排序题目输入3个数a,b,c,按大小顺序输出。思路和第五题一样 直接用系统排序 不必多言 代码实现C语言/* 输入3个数a,b,c,按大小顺序输出。 */ #include <stdio.h> #include <stdlib.h> int gg(const void* x,const void *y) { //如果需要从大到小排序则写成return *(int *)y-*(int *)x; return *(int *)x-*(int *)y; } int main() { int p[10]; int i; for(i=0; i<3; i++) { scanf("%d",&p[i]); } //自带排序函数 在头文件<stdlib.h>中 qsort(p,3,sizeof(p[0]),gg); for(i=0; i<3; i++) { printf("%d ",p[i]); } return 0; }067:数组交换元素题目输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。思路先找到最大和最小的元素 然后交换(这里使用交换函数完成交换)代码实现C语言/* 输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。 */ #include <stdio.h> // 交换函数 使用指针接收 需要传入地址 不然无法影响主函数中的变量 void swap(int *a,int *b) { int t=*a; *a=*b; *b=t; } int main() { int p[10]={12,123,4,65,21}; int i,n=5; // 寻找最大值最小值位置 int mmax = 0,mmin = 0; for(i=0; i<n; i++) { if(p[i]>p[mmax]) { mmax=i; } if(p[i]<p[mmin]) { mmin=i; } } // 交换 swap(&p[0],&p[mmax]); swap(&p[n-1],&p[mmin]); // 打印 for(i=0; i<n; i++) { printf("%d ",p[i]); } return 0; }068:调整位置题目有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。思路这道题有很多种思路 详见我之前发的文章 1046: [编程入门]自定义函数之数字后移代码实现C语言/* 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。 */ #include <stdio.h> int main() { int i,j=0; int x,n; int p[1007]= {0}; scanf("%d",&n); for(i=0; i<n; i++) { scanf("%d",&p[i]); } scanf("%d",&x); for(i=x+n-1; i>=0; i--) { //全部移动x位 p[i]=p[i-x]; } //后面的移到前面来 j=n; for(i=0; i<x; i++,j++) { p[i]=p[j]; } for(i=0; i<n; i++) { printf("%d ",p[i]); } return 0; }069:报数问题题目有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。思路报数问题也就是约瑟夫环,用链表或数组都可以 代码实现C语言/* 有n个人围成一圈,顺序排号。 从第一个人开始报数(从1到3报数) 凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 报数问题也就是约瑟夫环,用链表或数组都可以 */ #include <stdio.h> #include <stdlib.h> typedef struct node { //定义一个结构体,中间存放下一位置的指针以及数据 int data; struct node *next; } Node,*List; List Init_list(int n) { //初始化表,传入的n为所要求的人数 int i; Node *t = (Node *)malloc(sizeof(Node)); //创建一个指针t,t指针的数据域不赋值,用来作为移动的指针 t->next = NULL; List head = t; //定义一个头节点,存放指针t的地址,为了最后一个节点指向头节点的后一个数据,也就是1的位置 for(i=1; i<=n; i++) { Node *temp = (Node *)malloc(sizeof(Node)); //创建一个指针temp,放入对应数据 temp->data = i; temp->next = NULL; t->next = temp; //将temp插入t指针的指针域中 t = temp; //插完之后t指针应该指向temp的内存地址为了下一次能够继续插入 } t->next = head->next; //此时的t作为尾节点,其指针指向1(也就是head->next) return head; } void find_del(List head,int m,int k) { //找数并且删除,直到最后一个数据 ,head为链表头节点,m为第几个开始,k为报数 Node *p,*t; //这里定义两个指针,p指向正在报数的地址,t指向p的前驱节点 int i; p = head; for(i=1; i<=m; i++) { //这里做的是定位到第几个数据开始报 , t = p; //每循环一次t指向p,p指向下一个节点 p = p->next; } while(p!=p->next) { //因为是循环链表,当链表中数据只剩下一个时,它对应的指针域应该指向它自己 for(i=1; i<k; i++) { //根据k进行移动,因为每一节点的指针域都指向对应节点,就不用像数组一样要考虑最后一个节点指向哪里 t = p; p = p->next; } t->next = p->next; //此时p指向报到k的的地址,t为p的前驱节点,也就是前面一个,这时我们要删除的是p所指的节点,(连接下面,写满了) free(p); //那么只需要将指针t的下一节点改为p的下一节点指针域,并且free(p),也就是删除p指针的数据 p = t->next; //这时p指针中为空,那么将p指向t的指针域也就移动到删除数的后面一节点了 } printf("%d",p->data); //while出来,即为所剩下来的数据 free(p); p = NULL; } //使用数组解决 void run() { int n,j,i,current = -1; int a[1007]; scanf("%d",&n); for(i=1; i<=n; i++) //将初始的数按1,2,3放入数组中 a[i-1] = i; while(n!=1) { //当总数为1时说明数组中只剩下一人 for(j=1; j<=3; j++) current = (current+1)%n; //current作为报数的下标 for(j=current+1; j<n; j++) //将下标后面的值依次往前移 a[j-1] = a[j]; current--; //去掉一个数后报数下标也要往前移一次 n--; //总人数减去1 } printf("%d",a[0]); //打印最后留在a[0]或者a[current+1]中的数即为最后一人 } int main() { int n; scanf("%d",&n); List head = (Node *)malloc(sizeof(Node)); head = Init_list(n); find_del(head,1,3); // run(); return 0; } 070:求字符串长度题目写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。思路字符串最后默认自带\0作为结束 代码实现C语言/* 写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。 */ #include <stdio.h> #include <string.h> //求字符串长度 //字符串最后默认自带\0作为结束 int length(char *s) { int i=0; while(*s++!='\0') { i++; } return i; } int main() { int len; char str[20]; scanf("%s",str); // 使用string.h库里面的strlen函数 // len=strlen(str); // 自己完成函数 len=length(str); printf("%d",len); } 071:结构体的输入输出题目编写input()和output()函数输入,输出5个学生的数据记录(学生姓名、性别、年龄)。思路这道题考察结构体的使用,对于结构体来说普通变量使用.来取出,指针变量使用->代码实现C语言/* 编写input()和output()函数输入,输出5个学生的数据记录(学生姓名、性别、年龄) 这道题考察结构体的使用,对于结构体来说普通变量使用.来取出,指针变量使用-> */ #include <stdio.h> // 定义学生结构体 struct Student { char name[50]; char gender; int age; }; // input函数用于输入学生数据 void input(struct Student students[], int count) { int i; for (i = 0; i < count; i++) { scanf("%s", students[i].name); scanf("%c", &students[i].gender); scanf("%d", &students[i].age); } } // output函数用于输出学生数据 void output(struct Student students[], int count) { int i; for (i = 0; i < count; i++) { printf("姓名: %s\n", students[i].name); printf("性别: %c\n", students[i].gender); printf("年龄: %d\n", students[i].age); } } int main() { const int n = 5; struct Student students[n]; // 输入学生数据 input(students, n); // 输出学生数据 output(students, n); return 0; }072:创建链表题目创建一个链表。代码实现C语言/* 创建一个链表 */ #include <stdio.h> #include <malloc.h> struct LNode { int data; struct LNode *next; }; struct LNode* createList(int n) { struct LNode *list, *p, *q; list = (struct LNode*)malloc(sizeof(struct LNode)); list->next = NULL; q = list; int i; for (i = 0; i < n; ++i) { p = (struct LNode*)malloc(sizeof(struct LNode)); printf("请输入第%d个元素的值:", i + 1); scanf("%d", &(p->data)); p->next = NULL; q->next = p; q = p; } return list; } void print(struct LNode* list) { printf("链表各值为:\n"); struct LNode* p = list->next; while (p != NULL) { printf("%d\n", p->data); p = p->next; } } int main() { struct LNode* list = NULL; int n; scanf("%d", &n); list = createList(n); print(list); return 0; }073:反序输出链表题目反向输出一个链表。 代码实现C语言/* 反向输出一个链表。 */ #include <stdio.h> #include <malloc.h> typedef struct LNode { int data; struct LNode *next; } LNode; LNode* createList(int n) { LNode *head, *p, *q; head = (LNode*)malloc(sizeof(LNode)); printf("请输入第1个元素的值:"); scanf("%d", &(head->data)); head->next = NULL; q = head; int i; for (i = 1; i < n; ++i) { p = (LNode*)malloc(sizeof(LNode)); printf("请输入第%d个元素的值:", i + 1); scanf("%d", &(p->data)); p->next = q; q = p; } return q; } void print(LNode* list) { printf("链表各值为:\n"); LNode* p = list; while (p != NULL) { printf("%d\n", p->data); p = p->next; } } int main() { int n; scanf("%d", &n); LNode* list = createList(n); print(list); return 0; }074:连接两个链表题目连接两个链表。代码实现C语言/* 连接两个链表。 */ #include <stdio.h> #include <malloc.h> typedef struct LNode { int data; struct LNode *next; } LNode; LNode* createList(int n) { LNode *list, *p, *q; list = (LNode*)malloc(sizeof(LNode)); list->next = NULL; q = list; int i; for (i = 0; i < n; ++i) { p = (LNode*)malloc(sizeof(LNode)); printf("请输入第%d个元素的值:", i + 1); scanf("%d", &(p->data)); p->next = NULL; q->next = p; q = p; } return list; } void print(LNode* list) { printf("链表各值为:\n"); LNode* p = list->next; while (p != NULL) { printf("%d\n", p->data); p = p->next; } } void connect(LNode* list1, LNode* list2) { LNode* p; for (p = list1; p->next != NULL; p = p->next) { continue; } p->next = list2->next; free(list2); } int main() { int n; scanf("%d", &n); LNode* list1 = createList(n); LNode* list2 = createList(n); connect(list1, list2); print(list1); return 0; }075:数字反转题目输入一个整数,并将其反转后输出。思路方法一 使用%10得到最低位数字 方法二 看成字符串,变成第35题字符串反转 代码实现C语言/* 输入一个整数,并将其反转后输出。 方法一 使用%10得到最低位数字 方法二 看成字符串,变成第35题字符串反转 */ #include <stdio.h> int main() { int n; scanf("%d",&n); int m=0; while(n) { m*=10; // 注意这条语句的位置 m+=n%10; n/=10; } printf("%d",m); return 0; }076:指针函数题目编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)。思路这道题的重点是指针函数的使用代码实现C语言/* 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n 当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)。 这道题的重点是指针函数的使用 */ #include <stdio.h> double evenumber(int n) { double s=0,a=0; int i; for(i=2; i<=n; i+=2) { a=(double)1/i; s+=a; } return s; } double oddnumber(int n) { double s=0,a=0; int i; for(i=1; i<=n; i+=2) { a=(double)1/i; s+=a; } return s; } int main() { int n; double r; // 重点 声明指针函数写法函数类型、指针、所需参数类型 double (*pfunc)(int); scanf("%d",&n); // 赋值的是函数名 if(n%2==0) pfunc=evenumber; else pfunc=oddnumber; r=(*pfunc)(n); printf("%lf\n",r); return 0; } 077:二重指针题目指向指针的指针。思路对于字符串数组有两种写法 代码实现C语言/* 指向指针的指针 */ #include <stdio.h> int main() { // 对于字符串数组有两种写法 // char s[][10]= {"man","woman","girl","boy","sister"}; char *s[] = {"man","woman","girl","boy","sister"}; char **q; int i; for(i=0; i<5; i++) { q=s[i]; printf("%s\n",q); } return 0; }078:找到最大的人题目找到年龄最大的人,并输出。代码实现C语言/* 找到年龄最大的人,并输出。 */ #include <stdio.h> struct man { char name[20]; int age; } person[3]= {"li",18,"wang",25,"sun",22}; int main() { struct man *q,*p; int i,m=0; p=person; for(i=0; i<3; i++) { if(m < p->age) { m=p->age; q=p; } p++; } printf("%s %d\n",q->name,q->age); return 0; }079:字符串排序题目字符串排序代码实现C语言/* 字符串排序 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int gg(const void *x,const void *y) { char **a = x; char **b = y; return strcmp(a,b); } int main() { int i,n=5; char p[][10] = {"man","woman","girl","boy","sister"}; qsort(p,n,sizeof(p[0]),gg); for(i=0; i<n; i++) { printf("%s\n",p[i]); } return 0; }080:猴子分桃子题目海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子平均分为五份,多了一个,这只 猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子?思路 注意:最后一只猴子不一定剩1个哦代码实现C语言/* 海滩上有一堆桃子,五只猴子来分。 第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。 第二只猴子把剩下的桃子又平均分成五份,又多了 一个,它同样把多的一个扔入海中,拿走了一份 第三、第四、第五只猴子都是这样做的, 问海滩上原来最少有多少个桃子? 注意:最后一只猴子不一定剩1个哦 */ #include <stdio.h> int main() { int x; // 桃子总数 int i = 0; // 循环轮数 int j = 1; // 暂存每轮尝试的起始e的倍数 while (1) { x = 4 * j; // 拟定起始e的值 for (i = 0; i < 5; i++) { // 一共五只猴子,五轮循环 if (x % 4 != 0) { // 最后一只猴子待分配的桃子数一定能被4整除 break; // 若在5轮中某一轮不能被4整除,则要重新更换起始e的值 } x = (x/4)*5+1; // 向上递归累加 } if(i>=5)break; j++; // 通过递增j来更换4的倍数,从而重新更换起始e的值 } printf("%d\n", x); return 0; } 081:补全算式题目809*??=800*??+9*?? 其中??代表的两位数, 809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。求??代表的两位数,及809*??后的结果。思路 这道题我真是做笑了,看起来像乱码一样代码实现C语言/* 809*??=800*??+9*?? 其中??代表的两位数, 809*??为四位数,8*??的结果为两位数,9*??的结果为3位数。 求??代表的两位数,及809*??后的结果 */ #include <stdio.h> int main() { int a,b,i; for(i = 10; i < 100; i++) { b = i * 809; //条件一 809*??=800*??+9*?? if (b==800*i+9*i) { // 条件二 809*??为四位数,8*??的结果为两位数,9*??的结果为3位数 if(b >= 1000 && b <= 10000 && 8 * i < 100 && 9 * i >= 100) { printf("%d = 800 * %d + 9 * %d\n", b,i,i); } } } return 0; }082:八进制转十进制题目八进制转换为十进制。思路 思路一 使用按权展开求十进制 思路二 当成字符串使用按权展开代码实现C语言/* 八进制转换为十进制。 思路一 使用按权展开求十进制 思路二 当成字符串使用按权展开 */ #include <stdio.h> void run1() { int n,k=1,z=0; scanf("%d",&n); while(n) { z+=n%10*k; k*=8; n/=10; } printf("%d",z); } void run2() { int i,z=0; char s[20]; gets(s); while(s[i]!='\0') { z=z*8+s[i]-'0'; i++; } printf("%d",z); } int main() { run1(); // run2(); return 0; }083:组成奇数个数题目求0—7所能组成的奇数个数。思路a1-a8可以取 0-7 这个八个数字,首位数字不为 0。 从该数为一位数到该数为8位数开始统计奇数的个数: 1.当只有一位数时也就是该数的最后一位,奇数个数为4 2.当该数为两位数时,奇数个数为4*7=28 3.当该数为三位数时,奇数个数为:4*8*7=224 ... 8.当该数为八位数时,奇数个数为:4*8*8*8*8*8*8*7(依次为最后一位到第一位)代码实现C语言/* 题目:求0—7所能组成的奇数个数。 程序分析: a1-a8可以取 0-7 这个八个数字,首位数字不为 0。 从该数为一位数到该数为8位数开始统计奇数的个数: 1.当只有一位数时也就是该数的最后一位,奇数个数为4 2.当该数为两位数时,奇数个数为4*7=28 3.当该数为三位数时,奇数个数为:4*8*7=224 ... 8.当该数为八位数时,奇数个数为:4*8*8*8*8*8*8*7(依次为最后一位到第一位) */ #include <stdio.h> int main() { long sum = 4, s = 4;//sum的初始值为4表示,只有一位数字组成的奇数个数为4个 int j; for (j = 2; j <= 8; j++) { printf("%d位数为奇数的个数%ld\n", j-1, s); if (j <= 2) s *= 7; else s *= 8; sum += s; } printf("%d位数为奇数的个数%ld\n", j-1, s); printf("奇数的总个数为:%ld\n", sum); return 0; }084:分解偶数题目一个偶数总能表示为两个素数之和。给出一个偶数,请把它分解成两个素数。思路素数|质数的问题很重要呀! 重点代码是这一行:if(vis(i)&&vis(n-i)) 代码实现C语言/* 一个偶数总能表示为两个素数之和。给出一个偶数,请把它分解成两个素数。 素数|质数的问题很重要呀! 重点代码是这一行:if(vis(i)&&vis(n-i)) */ #include <stdio.h> int vis(int n) { if(n<2)return 0; int i=2; for(i=2; i<n; i++) { if(n%i==0)return 0; } return 1; } int main(){ int n; scanf("%d",&n); int i; for(i=2;i<n;i++){ if(vis(i)&&vis(n-i)){ printf("%d = %d + %d\n",n,i,n-i); } } return 0; } 085:素数整除题目判断一个素数能整除几个9组成的数,例如: 素数13能整除6个9组成的数999999代码实现C语言/* 判断一个素数能整除几个9组成的数,例如: 素数13能整除6个9组成的数9999994 */ #include <stdio.h> int main() { int p,i=0; int sum=9; scanf("%d",&p); while(++i) { if(sum%p==0)break; else sum=sum*10+9; } printf("素数%d能整除%d个9组成的数%ld\n",p,i,sum); return 0; }086:字符串连接题目将两个字符串连接。思路因为c语言不能像c++的string一样直接赋值,所以需要单个赋值 思路一 使用string库的strcat函数拼接 思路二 使用自定义函数拼接 注意 都需要保证内存大于两个字符串代码实现C语言/* 将两个字符串连接。 因为c语言不能像c++的string一样直接赋值,所以需要单个赋值 思路一 使用string库的strcat函数拼接 思路二 使用自定义函数拼接 注意 都需要保证内存大于两个字符串 */ #include <stdio.h> #include <stdlib.h>// malloc申请内存函数在stblib.h库中 #include <string.h> // 自定义实现 strcat 函数 void charcat(char *str,char *str1) { while(*str!='\0')str++; while(*str1!='\0') { *str = *str1; str++; str1++; } // 注意最后加上\0 *str = '\0'; } char* strconnect(char *str1,char *str2) { char *str; // 需要保证内存大于两个字符串 str=(char*)malloc(strlen(str1)+strlen(str2)+1); str[0] = '\0'; // strcat(str,str1); // strcat(str,str2); charcat(str,str1); charcat(str,str2); return str; } int main() { char str1[20],str2[20]; char *str; scanf("%s%s", str1, str2); str = strconnect(str1,str2); puts(str); return 0; } 087:回答结果题目回答结果(不运行程序,写出程序的结果)思路提示 函数不传指针或者地址 都是形参 代码实现C语言/* 回答结果(不运行程序,写出程序的结果) 提示 函数不传指针或者地址 都是形参 */ #include <stdio.h> struct student { int x; char c; } a; void f(struct student b) { b.x = 555; b.c = 'w'; } int main() { a.x = 4; a.c = 'b'; f(a); printf("%d,%c", a.x, a.c); return 0; }088:打印星号题目读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。思路在考察循环的嵌套 , 使用while和for都可以做 代码实现C语言/* 读取7个数(1—50)的整数值,每读取一个值,程序打印出该值个数的*。 在考察循环的嵌套 , 使用while和for都可以做 */ #include <stdio.h> int main() { int n=7,i,m; // 循环七次 while(n--){ scanf("%d",&m); for(i=0;i<m;i++){ printf("*"); } printf("\n"); } return 0; }089:电话加密题目某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。思路将数字拆分成数组,便于操作每一位上的数代码实现C语言/* 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的, 加密规则如下: 每位数字都加上5,然后用和除以10的余数代替该数字, 再将第一位和第四位交换,第二位和第三位交换。 */ #include <stdio.h> void swap(int *a,int *b) { int t = *a; *a = *b; *b = t; } int main() { int i,n,p[4]; scanf("%d",&n); // 将这四位数放到数组里面 for(i=3; n!=0; i--) { // 得到这一位上的数 +5 然后对10取余 p[i] = (n%10+5)%10; n/=10; } // 交换14位和23位 swap(&p[0],&p[3]); swap(&p[1],&p[2]); //打印 for(i=0; i<4; i++) { printf("%d",p[i]); } return 0; }090:读结果题目读结果。(说出程序的结果)代码实现C语言/* 读结果。(说出程序的结果) 提示 t=*(a+i); *(a+i)=*(a+j); *(a+j)=t; 就是交换操作 */ #include <stdio.h> #define M 5 int main() { int a[M]= {1,2,3,4,5}; int i,j,t; i=0; j=M-1; while(i<j) { t=*(a+i); *(a+i)=*(a+j); *(a+j)=t; i++; j--; } for(i=0; i<M; i++) { printf("%d\n",*(a+i)); } return 0; }091:时间函数一题目打印本地时间代码实现C语言/* 打印本地时间 */ #include <stdio.h> #include <time.h> int main () { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); printf ( "当前本地时间为: %s", asctime (timeinfo) ); return 0; }092:时间函数二题目返回两个time\_t型变量之间的时间间隔代码实现C语言/* 返回两个time_t型变量之间的时间间隔 */ #include <stdio.h> #include <time.h> int main() { time_t start,end; int i; start=time(NULL); for(i=0; i<33000; i++) { printf("*"); } end=time(NULL); // 输出执行时间 // 返回两个time_t型变量之间的时间间隔 printf("时间间隔为 %6.3f\n",difftime(end,start)); }093:时间函数三题目计算n次循环的耗时代码实现C语言/* 计算n次循环的耗时 */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { long i=10000000L; clock_t start,finish; double TheTimes; printf("做%ld次空循环需要的时间为",i); start=clock(); while(i--); finish=clock(); TheTimes=(double)(finish-start)/CLOCKS_PER_SEC; printf("%f秒。\n",TheTimes); return 0; }094:猜谜游戏题目猜谜游戏。(编写一个数字猜谜程序)代码实现C语言/* 猜谜游戏。(编写一个数字猜谜程序) */ #include <stdio.h> #include <stdlib.h> #include <time.h> void game(void) { int n; char begin; int count = 1; srand((int)time(NULL)); int m = (rand() % 100) + 1; puts("游戏开始,请输入数字:"); while (1) { scanf("%d", &n); if (n == m) { printf("猜中了,使用了 %d 次!\n", count); if (count == 1) { printf("你是神级人物了!膜拜\n"); getchar(); printf("你已经达到最高级别,还需要玩吗?Y/N \n"); scanf("%c", &begin); if (begin == 'Y' || begin == 'y') { //重复玩的一个嵌套循环 game(); } else { printf("谢谢,再见!\n"); } } else if (count <= 5) { printf("你是王级人物了!非常赞\n"); getchar(); printf("需要挑战最高级别不?Y/N \n"); scanf("%c", &begin); if (begin == 'Y' || begin == 'y') { game(); } else { printf("谢谢,再见!\n"); } } else if (count <= 10) { printf("你是大师级人物了!狂赞\n"); getchar(); printf("需要挑战最高级别不?Y/N \n"); scanf("%c", &begin); if (begin == 'Y' || begin == 'y') { game(); } else { printf("谢谢,再见!\n"); } } else if (count <= 15) { printf("你是钻石级人物了!怒赞\n"); getchar(); printf("需要挑战最高级别不?Y/N \n"); scanf("%c", &begin); if (begin == 'Y' || begin == 'y') { game(); } else { printf("谢谢,再见!\n"); } } else { getchar(); printf("你的技术还有待提高哦!重玩? Y/N\n"); scanf("%c", &begin); if (begin == 'Y' || begin == 'y') { game(); } else { printf("谢谢,再见!\n"); } } break; } else if (n < m) { puts("太小了!"); puts("重新输入:"); } else { puts("太大了!"); puts("重新输入:"); } count++;//计数器 } } int main(void) { game(); return 0; }095:简单结构体题目简单的结构体应用实例。(实现结构体的赋值)代码实现C语言/* 简单的结构体应用实例。(实现结构体的赋值) */ #include <stdio.h> struct programming { float constant; char *pointer; }; int main() { struct programming variable; char string[] = "指针原来是套娃的"; variable.constant = 1.23; variable.pointer = string; printf("%f\n", variable.constant); printf("%s\n", variable.pointer); return 0; }096:子串个数题目计算字符串中子串出现的次数。请输入两个字符串,以回车隔开,母串在前,子串在后:abca a 输出:2代码实现C语言/* 计算字符串中子串出现的次数。 输入两个字符串,以回车隔开,母串在前,子串在后: abca a 输出:2 */ #include <stdio.h> #include <string.h> int subString(char *str,char *sub) { int count = 0, i, j; for (i = 0; i < strlen(str); i++) { for (j = 0; j < strlen(sub); j++) { if(str[i + j] != sub[j]) { break; // 出现了不同字符就退出循环 } } if (j == strlen(sub)) { count++; // 退出循环后若j的值等于子串的长度,则存在子串 } } return count; } int main(void) { char str[100],sub[50]; printf("请输入母串:"); gets(str); printf("请输入子串:"); gets(sub); printf("%d", subString(str,sub)); return 0; }097:文件写入题目从键盘输入一些字符,逐个把它们送到磁盘文件97.txt上去,直到输入一个#为止。思路fopen是一个用于打开文件的函数。 这个函数需要两个参数:第一个是文件名(通常是一个字符串), 第二个是模式(也是一个字符串),用于指定文件应该如何被打开。 第二个参数可选 : "r": 读取模式。打开文件进行读取。如果文件不存在,会返回错误。 "w": 写入模式。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件。 "a": 追加模式。如果文件存在,则在文件末尾追加内容;如果文件不存在,则创建新文件用于写入。 "r+": 读写模式。打开文件进行读取和写入。文件必须存在,否则会返回错误。 "w+": 读写模式。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件。允许读写操作。 "a+": 读写模式。如果文件存在,则在文件末尾追加内容;如果文件不存在,则创建新文件用于写入。允许读写操作,但写入操作总是在文件末尾进行。 "x": 创建并写入模式。如果文件存在,则打开失败;如果文件不存在,则创建新文件用于写入。这是POSIX标准中的一个模式,不是所有系统都支持。 "x+": 创建并读写模式。如果文件存在,则打开失败;如果文件不存在,则创建新文件用于读写。这同样是POSIX标准中的一个模式,不是所有系统都支持。 注意,除了基本的读写模式之外,你还可以在这些模式后面添加一些额外的修饰符,例如: "b": 二进制模式(binary mode)。在Windows平台上,这会影响文件的打开方式,使其以二进制方式处理,而不是文本方式。在其他系统上,这个修饰符可能没有效果。 例如,"rb" 表示以二进制模式打开文件进行读取,"wb" 表示以二进制模式打开文件进行写入。 fputc函数放一个字符串到文件内 fclose(file);函数关闭文件流 代码实现C语言/* 从键盘输入一些字符,逐个把它们送到磁盘文件97.txt上去,直到输入一个#为止。 fopen是一个用于打开文件的函数。 这个函数需要两个参数:第一个是文件名(通常是一个字符串), 第二个是模式(也是一个字符串),用于指定文件应该如何被打开。 第二个参数可选 : "r": 读取模式。打开文件进行读取。如果文件不存在,会返回错误。 "w": 写入模式。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件。 "a": 追加模式。如果文件存在,则在文件末尾追加内容;如果文件不存在,则创建新文件用于写入。 "r+": 读写模式。打开文件进行读取和写入。文件必须存在,否则会返回错误。 "w+": 读写模式。如果文件存在,则清空文件内容;如果文件不存在,则创建新文件。允许读写操作。 "a+": 读写模式。如果文件存在,则在文件末尾追加内容;如果文件不存在,则创建新文件用于写入。允许读写操作,但写入操作总是在文件末尾进行。 "x": 创建并写入模式。如果文件存在,则打开失败;如果文件不存在,则创建新文件用于写入。这是POSIX标准中的一个模式,不是所有系统都支持。 "x+": 创建并读写模式。如果文件存在,则打开失败;如果文件不存在,则创建新文件用于读写。这同样是POSIX标准中的一个模式,不是所有系统都支持。 注意,除了基本的读写模式之外,你还可以在这些模式后面添加一些额外的修饰符,例如: "b": 二进制模式(binary mode)。在Windows平台上,这会影响文件的打开方式,使其以二进制方式处理,而不是文本方式。在其他系统上,这个修饰符可能没有效果。 例如,"rb" 表示以二进制模式打开文件进行读取,"wb" 表示以二进制模式打开文件进行写入。 fputc函数放一个字符串到文件内 fclose(file);函数关闭文件流 */ #include <stdio.h> #include <stdlib.h> int main() { FILE*fp = NULL; char ch; if ((fp = fopen("97.txt", "w")) == NULL) { printf("ERROR!\n"); exit(0); } printf("输入字符,以#结束:\n"); getchar(); while ((ch = getchar()) != '#') { fputc(ch, fp); } fclose(fp); return 0; }098:字母转换题目从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"98.txt"中保存。思路fprintf(fp,"%s",str); fp为文件 %s输出格式 str是字符串 这样就将str的内容以字符串的形式存入了文件中代码实现C语言/* 从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"98.txt"中保存。 fprintf(fp,"%s",str); fp为文件 %s输出格式 str是字符串 这样就将str的内容以字符串的形式存入了文件中 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE*fp=NULL; char str[50]; int i,len; printf("输入一个字符串:\n"); gets(str); len=strlen(str); // 小写转大写 这里用到ASCII值 for(i=0; i<len; i++) { if(str[i]<='z'&&str[i]>='a') str[i]-=32; } if((fp=fopen("98.txt","w"))==NULL) { printf("error: cannot open file!\n"); exit(0); } fprintf(fp,"%s",str); fclose(fp); return 0; }099:文件合并题目有两个磁盘文件97.txt和98.txt,各存放一行文字 要求把这两个文件中的信息合并,输出到一个新文件C中。代码实现C语言/* 有两个磁盘文件97.txt和98.txt,各存放一行文字 要求把这两个文件中的信息合并,输出到一个新文件C中。 */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *fa,*fb,*fc; int i,j,k; char str[100],str1[100]; char tem; if((fa=fopen("97.txt","r"))==NULL) { // 97.txt 文件需要存在 printf("error: cannot open A file!\n"); exit(0); } fgets(str,99,fa); fclose(fa); if((fb=fopen("98.txt","r"))==NULL) { // 98.txt 文件需要存在 printf("error: cannot open B file!\n"); exit(0); } fgets(str1,99,fb); fclose(fb); // 拼接两个字符串 strcat(str,str1); if((fc=fopen("99.txt","w"))==NULL) { // 合并为 99.txt printf("error: cannot open C file!\n"); exit(0); } fputs(str,fc); fclose(fc); return 0; }100:计算成绩题目有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,况原有的数据和计算出的平均分数存放在磁盘文件"stud"中。代码实现C语言/* 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩) 请你计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件"100.txt"中。 */ #include <stdio.h> #include <stdlib.h> typedef struct { int ID; int math; int English; int C; int avargrade; char name[20]; } Stu; int main() { FILE*fp; Stu stu[5]; int i,avargrade=0; printf("请输入5个同学的信息:学生号,姓名,3门成绩:\n"); for(i=0; i<5; i++) { scanf("%d %s %d %d %d",&(stu[i].ID),stu[i].name,&(stu[i].math),&(stu[i].English),&(stu[i].C)); stu[i].avargrade=(stu[i].math+stu[i].English+stu[i].C)/3; } if((fp=fopen("100.txt","w"))==NULL) { printf("error :cannot open file!\n"); exit(0); } for(i=0; i<5; i++) fprintf(fp,"%d %s %d %d %d %d\n",stu[i].ID,stu[i].name,stu[i].math,stu[i].English, stu[i].C,stu[i].avargrade); fclose(fp); return 0; }
2024年05月16日
16 阅读
0 评论
1 点赞
1
2
3