C语言,从入门到入土
一些C语言的简单算法题
二狗mao
一个大一的软工人,方向是Java后端开发,关注必回关。上的是b站上尚硅谷的,博客当笔记写,笔记内容都是尚硅谷课上的。来自井冈山大学
展开
-
C语言,求一个整数的全部素数因子
3.每次除以一个质数后,还要判断除完之后的n还能不能继续和那个质数整除。所以要i--,让i变回去,直到不会被整除为止,i会继续找下一个被除完后的n整除的数字。2.素数一定不能从一开始判断因为任何数%上一都会等于0,也不能判断到n,n%n也会等于0,素数的定义是不会被一和它本身整除的数,判断要从2开始,到n-1。1.主函数中while的判断条件要写成n > 1,因为最后n会被除为1,然后结束循环。原创 2023-10-16 20:17:41 · 2743 阅读 · 2 评论 -
C语言,打印指定大小的X
只要if判断条件里面用逻辑或将两条线的坐标关系一起判断,就可以在这些坐标赋值为*。其他的进不了if的,就都赋值为空格字符。要打印一个X,无非是在一个二维数组一个矩形中操作,将不是X的部分赋值为空格字符,将是X部分打印为*字符。矩形的边长就是输入的n,由于矩形的边长是不固定的,所以要找到应该被赋值为*的坐标之间有什么数学关系。原创 2023-10-16 19:55:41 · 259 阅读 · 1 评论 -
C语言,洛谷题,赦免战俘
1.pow的返回值类型是double,所以我使用循环的方法进行累乘,达到求2的n次方的结果。以方便后面使用bian的值进行计算。2.创建全局数组arr,就不用再进行数组的传参(数组的传参也是可以的)。递归会直到边长为2为止,然后将左上角的元素赋值为0,最后结束递归。原创 2023-10-15 20:35:18 · 204 阅读 · 0 评论 -
C语言,-1与sizeof()返回值的比较
无符号整型就没有最高位代表正负的规则了,默认-1的补码当作正数的补码处理,正数的原码反码补码一致,所以-1的原码为11111111111111111111111111111111,转化为十进制为4294967286,当然是大于sizeof的返回值4。i在i--之后变成了-1,sizeof(i)的大小为四个字节,所以返回值为无符号整型4,同时-1也会被转化为无符号整型。3.当一个表达式里既有有符号整型,又有无符号整型,会将表达式里的对象都转化为为无符号整型。所以代码的结果输出为A。原创 2023-10-15 18:54:35 · 238 阅读 · 0 评论 -
C语言,求两个数的二进制表达中,有多少个位数不同
只要将两个数的每一个位数按位与1,再进行比较,比较完之后,再利用右移操作符,将位数降低。再分别按位与1,进行比较……以前我的博客中写过一篇求二进制的1的个数的博客,里面用按位与1的方式来判断位数是否为一。而二进制中一个位数只能为0或者1,便可以利用这个方法,来判断每一个位数上的数字是否相等。操作符的优先级有高低顺序,所以要根据操作符的优先级和期望的计算顺序来添加括号。再创建一个计数器,创建变量count,每次位数不一样时,就count++原创 2023-10-14 21:55:44 · 276 阅读 · 0 评论 -
C语言,求一个十进制数的二进制中1出现的次数,版本2.0(另外两种方法介绍)
十进制的数字要分离十进制的每一位,要先模上10,获取个位数,接着除以十,将每一个位数都降低一级。但是这种方法有一个缺点,如果n为负数,count的值就会为零,因为count在count++之后就会变成0,而0进入到循环的判断条件中,就会终止循环。这里利用里二进制逢二进一的特点,每当一位数是1后面位数都是0时,减去一就是让其位数变成0。再利用按位与的特点,只有位数都为一时,结果位数才为1。用按位与&实现的方法在我之前的博客中写过了,但是无论是按位与的方法还是上面的方法,当n够大的时候,都要进行多次计算。原创 2023-10-14 20:18:16 · 207 阅读 · 0 评论 -
C语言,指针的一些运算
为什么传址调用就可以使用arr++了呢,因为函数接收到的不是数组,而是首元素的地址,这里的arr并不是数组名,而是一个存放了数组的首元素的指针变量,指针变量进行加减就是可以的了。减法也是同理,还可以用指针的方式来相减,即指针减指针,第3个元素的地址减去第一个元素的地址就为2,以此类推。因为数组名代表首元素地址是数组名的性质,性质是不可改变的,不会因为加减就改变数组名是首元素地址的性质。用指针变量来储存数组首元素的地址:int* p = arr,这里arr是数组名,表示首元素地址。原创 2023-10-12 21:41:43 · 587 阅读 · 1 评论 -
C语言,标志法
这里的flag就是用来检查是否有相同数字的,如果有相同的数字,就将检查结果判为0,如果没有相同的数字,检查结果就为1。这里便是用flag来观察是否有相同数字的。这里的flag用来检测i是否被某个数整除,如果被整除,flag就变成0,一直不被整除,说明i是素数。这里的flag就是用来观察并判断i是否被整除。有时候标志法还可以进行一些中途的变化,建立一个标志,有时候能完成一些变量的指定变化,省略很多分支。这里的ch在起初被赋值为数组的首元素,当连续的元素的值发生变化时,ch就被赋值为变化后的值。原创 2023-10-12 21:10:32 · 196 阅读 · 2 评论 -
C语言,洛谷题:你的飞碟在这
文中要把字母A对应到1,Z对应到26,这时候就要用上ASCII表了。A对应的ASCII码值是65,要让A对应1,只要将A减去64,后面的字母也是一样的只要减去64,就能对应其26字母中的顺序。要存储字符串对应的每个元素的数字的乘积,可以先创建一个字符数组,再用循环的方式进行储存乘积。循环的次数要根据字符串的长度来决定,要用strlen求出两个字符数组的长度,当作各自的循环次数。相等则输出GO,不相等则输出STAY。每次存储乘积的变量只要乘以相应字符减去64,最终便可以获得最后的数字。原创 2023-10-11 19:55:06 · 128 阅读 · 0 评论 -
C语言,洛谷题,压缩技术2.0
ch记录的是str首元素的内容,在元素未发生变化时,会一直记录后面和ch一样元素的个数。当元素发生变化时ch就会变成变化后的元素,继续计算接下来连续元素的个数。题目指出,输入的是一个n*n大小的输入数据,可以先打印第一行后,计算第一行后,计算第一行的字符串长度,第一行的字符串长度就是n的值。这题用C语言实现有一些难度,要用到一个库函数,strcat(头文件是string.h),用于连接两个字符串数组,strcat(str,arr)就是将arr字符数组后面的\0清除,再将arr字符拼接到str上。原创 2023-10-11 19:05:50 · 125 阅读 · 0 评论 -
C语言,求质因数中的较大的值
首先要求出输入的质数的两个质因数,就要用到判断素数时用到的方法。用内循环产生2到n的数字,当求到了质因数之后,也要先用一个变量将质因数存起来,当后面遇到更大的质因数时,再将原来的质因数覆盖,如果更小则不覆盖。原创 2023-10-10 18:18:00 · 144 阅读 · 1 评论 -
C语言,求一串数字里没有重复过的数字
3.内循环检测是否有相同元素时,不能让arr[ i ] 和 arr[ j ] 比较时,使得i与j相等,因为就算相应元素在数组中只出现一次,当i与j相等时,flag一样会被赋值为0。要设一个if,当i与j不相等时,才会进行检测。1.这里用到了标志法,创建一个变量flag,一旦检测倒有相同的数字,就将flag赋值为0。最后if判断,如果flag为1,就打印相应元素。2.检测要用双循环的方法,外循环是为了让每一个数组元素都能被检测到,而内循环是用来判断被检测的元素在数组中有没有相同的元素。原创 2023-10-10 17:59:07 · 364 阅读 · 1 评论 -
C语言,输出最长连号的个数
要实现求连号的个数,就要创建一个变量,用来专门计算连号的个数。在不满足连号时,就将连号的个数用另一个变量记录起来。最长连号,就是一组数字里面出现的连续的数字的最长长度。这里的连号最长是2 3 4 5 6,个数为5。读取到第n个值时,会用到arr[ n + 1 ],所以按数据范围应该把数组大小至少设为10001。但是千万不能直接记录,不然如果后面出现了个数更小的连号就会重新记录连号个数,会导致结果不理想。应该要用if语句来限制记录,只有判断结果更大时count才能覆盖掉原来的原来记录的连号个数q。原创 2023-10-09 19:56:30 · 603 阅读 · 3 评论 -
C语言,低洼地问题
知道这一点,就简单太多了,只要先创建一个变量记录下坡,再创建第二个变量,第二个变量只有在第一个变量已经记录到下坡之后,再记录到上坡,才会加一,当然第二个变量加一之后,也要清除第一个变量的记录下坡,因为这时候已经记录完一个低洼地的个数了,不能让这个下坡的记录影响后面低洼地的计算。最简单的低洼地的特征是前边下坡后边上坡。第一种,就是图中序号3的那个低洼地,先下坡再平坡然后又是上坡,这里也算一个低洼地。虽然低洼地有几种特殊情况,但是低洼地都是有共同特点的。1是负数,可能会出现多出低洼地的情况。原创 2023-10-09 10:38:21 · 243 阅读 · 1 评论 -
C语言,小写转大写,大写转小写。
4.不能两个if判断,因为第一个if判断完,如果cha是小写,cha会变成大写,又会进入if语句,又会变成小写,就不能完成小写变成大写了。2.小写的ASCII码值比大写的ASCII值大32,32也就是空格字符的ASCII值,大写转小写只要加一个空格字符或者加32就可以,小写转大写同理。1.scanf的返回值是scanf读取的个数。若scanf未读取任何东西,返回值为EOF,即-1。3.getchar()是用来读取\n的如果没有getchar(),\n会被scanf读取,会输出\n的改变值。原创 2023-10-08 22:55:21 · 501 阅读 · 0 评论 -
C语言,求自幂数
有些题目说输入100000以内的水仙花数,答案却有四位五位的数字,但是水仙花数是三位自幂数,四位自幂数叫四叶玫瑰数,五位是五角星数,而且所有个位数都是自幂数,称为独身数。所以求自幂数的原理与求水仙花数同理(1本来不是水仙花数,因为水仙花数是三位数),但是要做一些修改,要先判断位数,再用数学库函数pow,实现相应的次幂。求位数这里用递归的方式,每次/10少一个位数,并让返回值加一,直到只剩个位数为止,再返回一个一。注:pow是一个数学库函数,头文件是math.h,pow(x,y)意思就是x的y次方。原创 2023-10-08 08:38:57 · 418 阅读 · 0 评论 -
C语言,序列中删除指定数字
最后,再设一个输出的循环,里面放一个if语句,判断条件为arr[ j ] == s,if的执行语句为continue,如此,当arr[ j ] == s 时,就跳过一次打印,就完成了对指定数字的删除。接着用scanf输入n的值,再设一个循环,i从0开始,判断条件为i < n,就可以给数组里的前n个数赋值。先创建一个数组,数组大小应该要根据题目要求,根据数据范围,要设立一个大小为50的数组。题目考点:对continue的运用。接着输入s,即想要删除的数字。原创 2023-10-07 20:45:38 · 796 阅读 · 1 评论 -
二进制,八进制,十六进制
因为十六是二的四次方,可以以二进制的每四位作为十六进制的一位,比如37的二进制100101,转化为十六进制,第一位是二进制从右往左四位,0101,即5,第二位则是再数四位。八进制的1234计算也是类似与二进制,1乘以8的三次方加2乘以8的二次方加3乘以8的一次方加4乘以8的零次方。十六进制也是一样的方法,十六进制的234,就是2乘以十六的二次方加3乘以十六的一次方加4乘以十六进制的零次方。1111,要算作十进制,就是1乘以2的三次方,加1乘以2的二次方,加1乘以2的一次方,加1乘以2的零次方。原创 2023-10-07 10:23:47 · 106 阅读 · 2 评论 -
C语言,记负均正
3.arr[ i ] 的值不管是大于0还是小于0都应该有相应计数变量,正数要计数器是因为计算平均值时,是sum/正数的个数。1.sum的储存也要和p一样设为float或者double类型的,不然sum/count两边都是整数,会出现计算错误。4.要按照题意,n的取值范围是0-2000,那么数组的大小也应该是2000。2.count1的情况应该要分开来,分为0和非0的情况打印。原创 2023-10-06 21:26:35 · 115 阅读 · 2 评论 -
C语言,整数的逆序打印,若个位数为0,逆序不打印0
至于个位数为0,可以在整数进入函数之前就可以先进行判断个位数是否为0,如果为0,就进行除10的运算,再进入函数进行逆序,就可以做到逆序不打印0的效果。可以用递归的方式一步一步得到这个整数的每一位数,直到递归到个位数,如此printf应该放在递归前面,才能完成整数的逆序打印。原创 2023-10-06 10:35:26 · 267 阅读 · 1 评论 -
C语言,求一定范围内的水仙花数
最后将每一位数的值的三次方加起来,判断是否与这个数相等,就能判断这个数是不是水仙花数。要得到一个数的每一位数,可以使用循环或者递归的方式,将每一位数用模和除的方式得出来。153就是一个水仙花数。水仙花数是指一个数等于它每一位数的三次方之和。原创 2023-10-05 22:44:15 · 555 阅读 · 1 评论 -
C语言,验证尼科彻斯定理
不难发现,要输出的奇数列,都是以m * m为对称的。这个对称轴两边各有n / 2 个元素,每两个元素之间相差2。所以第一个元素总是m * m - m +1。设计一个循环,循环次数为m次,每循环一次,打印一个元素,打印一个加号,到第m次的时候,使用continue跳掉打印加号。就完成了奇数列的打印。原创 2023-10-05 17:49:39 · 90 阅读 · 1 评论 -
C语言,求一个整数存储在内存中的二进制中的1的个数。
以n和1来按位与,1的二进制只有第一位是1,按位与是相同位数只有都为一,结果的对应位数才为1,若n的二进制第一位是1,n & 1的结果就是1,若n的二进制第一位是0,n & 0的结果就是0,就能判断n的二进制第一位是不是1,后面的位数又该怎么判断呢?这时候右移位操作符就派上用场了。右移操作符能让二进制的位数往右移动,只要每检测完一位,就让位数右移一位,将三十二位用循环一一检测,就能检测出1的个数。原创 2023-10-05 00:01:02 · 74 阅读 · 2 评论 -
C语言,不创建临时变量,完成两个变量a,b的交换
可以将b的值加到a里面,得到的a的值就是a和b的和,再用a减去b,即用a,b的和减去b,再赋值给b,b的值就变成的原来a的值。最后用a减去b,即用a,b的和减去原来a的值,a的值就变成原来b的值。如果3和0进行按位异或,011和000,位数相异为1,位数相同为0,得到的结果为011,可以得知一个数与0进行按位异或,得到这个数本身。但是这种方法有缺点,如果a,b数值太大,容易溢出int的范围,想要用一种不溢出的方法,就要用到按位异或的方法。以3和5为例子,只写出二进制的三个位数,3和5分别为011,101。原创 2023-10-04 19:48:44 · 255 阅读 · 1 评论 -
C语言,函数判断100-200的素数,以及素数个数
由于一个数的因数一般都是成对的(每对因数相乘等于这个数),所以只要测试前半对因数就可以。前半对因数都是小于这个数的开方,所以不需要一直试到这个数本身,只要一直试到这个数的开方就可以(当然要试到这个数本身也不会错)。在函数内,只要语句执行到return就马上跳出函数。只要要判断的数被哪个大于等于2的数整除了,就会返回0,然后if判断为假,不会被打印,也不会count++。只有被判断为素数,count的值才会加一。原创 2023-10-03 22:10:55 · 324 阅读 · 0 评论 -
C语言,列举出一定范围内的完数
只要用相模的方法,就能找到一个数的因数再将其累加到一个变量中,再判断最终这个变量的值是否等于这个数,便能判断这个数是否是完数。外循环的k是代表想判断的数字,1肯定不是完数,如果外循环从1开始,内循环就无法启动,所以外循环可以直接从2开始。一个数如果除了它本身的所有因数相加会等于它本身,就称这个数为完数。内循环j < k,刚刚好不会将要判断的数本身累加进去。原创 2023-10-03 21:07:32 · 200 阅读 · 0 评论 -
C语言,打印菱形
第二次循环先left和right的变化的原因是第一次循环最后left-- right++把left变成了-1,把right变成了14,如果不处理,数组就会越界,所以要先把left变为0,把right变为13。数组的大小NUM不能设置为十三,因为虽然有十三个字符,但是字符串末尾是有一个\0的,也要给这个\0一个空间。使用left++ right--和left-- right++的方法就可以完成打印。当然这里要提供三个数组,arr2提供*字符,arr3提供空格字符。再经过两次循环,就可以完成打印了。原创 2023-10-02 22:48:45 · 61 阅读 · 2 评论 -
C语言,两个空瓶子可以换一瓶汽水,递归实现
如果x进入函数为奇数时,会有空瓶子要留着下下次与下次喝完的空瓶子一起拿去换,直到实在拿不出两个空瓶子的时候停止递归。最后剩下的空瓶子当然也是喝过的,也要计算上去。每次递归带进去偶数就不用再加空瓶子到下一次递归了,如果除以二又变成奇数,再按奇数的方法继续递归。原创 2023-10-02 21:37:27 · 207 阅读 · 1 评论 -
C语言,扫雷游戏,简易版
这里和三子棋一样,头文件stdio.h,time.h,stdlib.h的调用放在game.h中就可以,然后test.c和game.c只要调用game.h就可以。get_mine_count函数中运用了关于数字字符ASCII码的一些知识,字符'1'的ASCII值减去'0'的ASCII值就会等于1。行数和列数设置为十一的原因时排查雷的时候要查坐标周围一圈的坐标,设置为十一时,数组的访问才不会越界。游戏界面和游戏进入和退出通过test.c来实现。头文件game.h用来声明一些函数,以及定义一些值。原创 2023-10-01 22:14:58 · 52 阅读 · 2 评论 -
C语言,数列合并排序
首先要实现数组的排序,当然要用到冒泡排序。若冒泡排序不会,可以进我的主页,我曾写过关于冒泡排序的博客。要完成数组归并,可以创建另一个数组,将要归并的数组的元素一一放到第三个数组里面。这里的关键点无非两点,冒泡排序和数组归并。原创 2023-10-01 19:53:21 · 49 阅读 · 0 评论 -
C语言,函数递归实现字符串的反向排列(不用库函数strlen,不能逆着方向排列)
这种方法比较复杂,以a和k为例,先将a放在一个临时变量里面,再把k放到a的位置,接着在原来k的位置上放上'\0',接着让b-j进入递归,最后再用a替换掉原本在k位置上的'\0',完成替换。这种方法更为简单,让最左边的元素和最右边的元素交换完后,左边的元素右移一位,右边的元素左移一位,再进入递归,直到如条件中所示left不再小于right。当然不要忘记,函数递归要有限制条件,由于已经被处理过的元素替换为了'\0',当剩下的元素大于一的时候,元素就还要继续进行替换。原创 2023-09-30 20:58:12 · 45 阅读 · 0 评论 -
C语言,将矩阵行和列交换。
打印时,再将原本的arr[ a ][ i ]换成arr[ i ][ a ],就能完成先打印数组的第一列,再打印数组的第一行。每个元素后面有一个空格,printf里面%d后面要加上空格。外层for循环控制行数,内层for循环控制列数,输入时,要给数组相应元素赋值,共有n行m列,所以外层a < n,内层i < m。打印时,行数和列数进行了交换,所以外层变成了a < m,内层变成了i < n。打印的时候,数组元素其实并没有改变,只是元素的打印顺序发生了改变。每完成一行的打印都要换行,要在相应位置加上\n。原创 2023-09-30 16:29:03 · 1452 阅读 · 4 评论 -
C语言,三子棋游戏实现
本人只是一个大一学生,用博客进行笔记记录,下面的代码在坐标输入错误然后重新输入的时候,会出现接下来的坐标识别会乱套,但是如果从来没有输入错误过坐标就不会出现识别问题,不知道是scanf的问题,还是我代码的使用出现了问题。首先,函数声明放在头文件game.h中,与此同时,还可以直接将源文件想要包含的头文件:stdio.h,time.h,stdlib.h也直接在game.h中包含,源文件中只要包含game.h就可以。只要判断相应的元素是相等的便可以。原创 2023-09-30 11:16:18 · 42 阅读 · 0 评论 -
C语言,冒泡排序
2.因为冒泡排序每跑一趟,就有一个元素完成了排序,所以maopao函数中for循环中的判断条件的值也要每跑一趟就减一,而每跑一趟,i的值都会加1,初始i为0,可以将for的判断条件写为j < sz - 1 - i。1.同二分查找的函数一样,sz的存储不能放在函数之中,因为arr是将首元素地址传到函数里面去了,此时函数内arr指的是arr中首元素的地址,应该将主函数中的sz通过传参传到函数里面。原创 2023-09-28 19:39:19 · 92 阅读 · 0 评论 -
C语言,数组元素的依次打印
可以发现,数组的元素存放是连续的。地址之间相差4,因为一个整形元素所占内存大小为4个字节。原创 2023-09-27 21:48:34 · 204 阅读 · 1 评论 -
C语言,函数递归实现计算n的m次方
要想使用函数递归实现n的m次方计算,可以设计函数时,可以先储存一个c值为1,每次调用c都要乘以一个n,再将m的值减一,还要将m的值当作if的判断条件,当m为0时,函数便不再继续调用,此时原本为1的c也就乘以了m次的n。int c = 0放在外面的原因是,如果放在函数里面,每次调用函数,c都会被重新赋值为1,便不能完成n乘积的累积。原创 2023-09-27 20:41:18 · 326 阅读 · 1 评论 -
题目:C语言,计算1-1/2+1/3-1/4......+1/99-1/100
先将奇数部分加在一起,再将偶数部分加在一起,接着用奇数减去偶数部分,就能得到计算值。还可以在每次循环相应的地方乘上一个-1,便完成了奇数偶数的正负交替。原创 2023-09-26 21:54:43 · 976 阅读 · 0 评论 -
C语言,求两个数的最大公约数
最简单的方法,就是从两个数中那个较小的数开始,慢慢减小地数。具体没有什么需要特地强调的,都是一些基本思维。更好的方法是使用一种方法:辗转相除法。如果数字够大,这种方法就会慢很多。原创 2023-09-26 21:26:00 · 164 阅读 · 0 评论 -
C语言,函数递归与迭代,阶乘与斐波那契数列
由于前两个数并不能用abc的方法,实际运行时c是从第三个斐波那契数开始算,总之要保证循环次数为n - 2,也要对应到n为1和2的情况时,斐波那契数都为1。这里利用c,完成了a,b的移动,也完成了c的移动。a,b,c只需要按顺序移动和计算,计算速度更快。这种方法如果n稍微大一点会进行太多次计算,速度很慢。这里便要使用非递归的方法,使用迭代的方法。到a-1等于1的时候,进入if之后,递归结束。也可以用迭代的方法,用循环完成阶乘的计算。除了用i++的方式,还可以用i--的方式。首先用递归的方式实现阶乘计算。原创 2023-09-26 10:01:52 · 122 阅读 · 0 评论 -
C语言,函数递归,模拟strlen
moni_strlen每运作一次return值加一,并且*str变为下一个元素,直到遇到\0。不创建临时变量,可以使用函数递归的方法,来模拟strlen。首先不用递归,用创建临时变量的方法来实现模拟strlen。str++之后,*str指向下一个数组元素。最终len的值就是字符的长度。原创 2023-09-25 20:55:21 · 71 阅读 · 1 评论