自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 收藏
  • 关注

原创 “生成元”问题——穷举生成“查找表”

本题的新知识点就是用程序生成一个“查找表”,方法是一次性枚举100000内的所有正整数m,它肯定是“m加上m的各个数字之和(即y)”的一个生成元,所以可以用数组ans[]建立一个查找表,取ans [y]的值为最的小m,即ans[y]的值为y的最小生成元,最后查表即可。给出n(1≤n≤100000),求最小生成元。例如,n=216,121,2005时的解分别为198,0,1979。建立查找表的好处就是只需要完整地遍历一次,以后在数据范围内求任何数的最小生成元都能通过查找表快速查找,几乎不需要任何计算。

2024-04-25 22:40:00 190

原创 字符的表示方法

不过,有一些字符直接表示出来并不方便,需要用转义序列(EscapeSequence)表示(以反斜线开头的字符)。为了方便书写,C语言允许用直接的方法表示字符,例如,“a”代表的就是a的ASCII码。每一个字符都有一个整数编码,称为ASCII码。如A的ASCII码值为65。空字符:“\0”,它也是C语言中字符串的结束标志。反斜线: “\\”(注意必须有两个反斜线)、双引号: “\"”和“"”都表示双引号。单引号:“\'”(这个是单引号),.直接用字符或转义字符表示。

2024-04-25 16:49:30 78

原创 “猜数字”问题的巧转换

从样例中能看出统计A时是不去重的,但看不出统计B时是不是去重的,从代码中能看出是不去重的。对于每个数字(1~9),设其在答案序列中出现的次数为c1,在猜测序列中出现的次数为c2,则min(c1,c2)就是总配成的对数。这个问题如果这样描述就简明多了:对猜测序列与答案序列相同的数字进行配对,位置相同的优先配对,统计配成的对数。或者这个问题也可以转化为连线问题,猜测序列与答案序列相同的数字进行连线,位置相同的优先连线,每个数字只能连一次线,A指连成的竖线数,B指连成的斜线数。②找到的数不能是已配过对的数。

2024-04-24 17:30:13 596

原创 memset函数的特别之处

注意,由于memset 是按字节操作的,所以它适合初始化char型,不适合初始化多字节的数据类型(如 int、float、double等),除非是将它们都初始化为0(这其实是memset的常用用法,因为所有字节都初始化为0,不管数据类型是几个字节的它也都是0)。memset的功能是以字节为单位初始化一块连续的内存空间(一般用于数组),将其所有字节都设置为特定的值。c 是要填充的值,虽然参数类型是 int,但实际上只有该值的低 8 位(一个字节)会被用来填充内存。str 是指向要填充的内存块的指针。

2024-04-24 14:17:17 172

原创 字符类型判断库函数合集

控制字符是那些用于控制文本流而非直接表示可打印字符的字符,其ASCII范围:0x00-0x1F和 0x7F(0-31和127)。常见的控制字符为:退格、水平制表符、换行键、回车键、删除。空白字符有6个:空格(' ')、水平制表符('\t')、换行符('\n')、回车符('\r')、垂直制表符('\v')和换页符('\f')。可打印字符是那些可以在文本中显示并且具有实际意义的字符,它比图形字符多了一个空格(' ')。isspace检查一个字符是否是空白字符(white-space character)。

2024-04-23 20:46:50 473

原创 什么是“字符”?

古人为了保存好文字符号,一般都要用尖利的工具(石块、刀)将其刻到坚硬的东西(龟甲、兽骨、竹简)上。这充分展示出古人已经运用了物理学的压强知识和工业工程的精益原理,所以全世界的字符都是线条形。常见的字符编码有ASCII码、Unicode、ISO 8859系列、GB2312、GBK等,说白了这些都是人为规定的1、0的排列与各个字符的对应关系。所以字符在计算机内部是以二进制编码的形式存储和处理的,这些编码通常称为字符编码。在计算机领域,字符通常指的是字母、数字、标点符号、空格、控制字符等文本元素。

2024-04-23 15:23:34 95

原创 回车符和换行符的区别

从源头上说,Windows的用法更有道理,但是文本处理毕竟与打印机不同,它动的只是光标,一行结束只需要将光标移至下一行的开头。回车符(Carriage Return,简称CR,ASCII码为13,转义字符\r)和换行符(Line Feed,简称LF,ASCII码为10,转义字符\n)。那时,存储器很贵,有些人认为在每行结尾加两个字符太浪费了,加一个就可以。顺带说一句,其实老的macOS系统行结束用的是\r,后来随着Unix和Linux的流行改成了\n,现在只有Windows还死脑筋在一条道上渐行渐远……

2024-04-22 17:04:57 401

原创 “转义字符”知多少

①\xxx:其中 xxx 是1到3位八进制数,表示一个字符的八进制ASCII码。(注:八进制数通常以0开头,但在转义序列中,开头的0是可选的。在C语言中,以反斜杠 \ 开头,后面跟一个或多个字符,可用于表示这些不容易直接表示的字符。例如,\x41 也表示字符 'A'。有一些不容易直接表示的字符,最典型的是“换行符”,要表示这样的字符就需要用到“转义字符”。要明白,字符指的是单个的文字或符号,而序列是指一系列字符,因而\n确实不是字符。也就是说,严格来讲,\叫“转义字符”,而\n叫“转义序列”。

2024-04-22 17:03:14 118

原创 字符指针数组

在这个例子中,string_array是一个字符指针数组,包含8个元素,每个元素都是一个指向字符的指针,这些指针分别指向了8个不同的字符串字面量。字符指针数组(Character Pointer Array)是一个数组,其元素是指向字符的指针,通常用于存储字符串的地址。字符指针数组常用于存储一组字符串,每个字符串的地址作为数组的一个元素。

2024-04-21 16:41:12 70

原创 深度剖析“字符串与数组、指针”的关系

字符串的本质是数组,数组的本质是占用连续内存单元的多个变量(每个内存单元大小相同,就像把一整板豆腐切成大小相同的小块,每一块可看成一个内存单元,每个内存单元存储着一个变量——数组元素)。:因为是直接将字符串的首地址赋给指针,这里的字符串会被当作字符串常量,存储在程序的只读数据段(也称为文本段或代码段)中,因此用这种方式初化始后字符串是不能改变的。在C语言中,字符串是以字符数组的形式存储的。:这是用数组的方式初始化,字符串存储在程序的可写数据段(如堆或栈)中,因此你可以修改str数组中的字符。

2024-04-21 16:31:45 660

原创 标志变量的概念

标志变量是一个在程序设计中常用的概念,主要用于表示某种状态或条件是否成立。通常,标志变量是一个布尔类型的变量,即其值只能是真或假。

2024-04-20 23:56:50 97

原创 判断回文串和镜像串:巧妙利用ASCII码的连续性

字符长度len分奇数、偶数两种情况,奇数可表示为len=2n+1,偶数可表示为len=2n,它们要判断到的位数分别为n+1、n,用(len+1)/2一个表达式就正好可以求出正确的判断位数,而不用预先判断字符是奇数个还是偶数个。首先,它是一个数组,其次,数组中的元素都是指针,最后,这些指针指向的都是字符。2.本代码的一个巧妙用法是,利用了“连续字母、数字的ASCII码值也是连续的”这一特点,直接实现了字符与下标的对应关系,从而提高了查找效率(避免了使用循环查找字符位置,详见后面老金的代码)。

2024-04-19 20:15:23 1412

原创 利用常量数组解码的方法

该函数定义在 <string.h> 头文件中,strchr(s, c)的功能是在字符串s中查找字符c,如果找到,返回指向首次出现位置的指针。注意,它返回的是指向位置的指针,而不是位置的索引(数组下标)。1.读取函数的选择:如果每输入一个字符,都能通过某种规则直接求出要输出的字符(也就是说输出与输入的单个字符有关,与输入的单词、短语、句子无关),这种情况下用读取单个字符的函数getchar输入是理想的方法。严格来说,常量数组的元素均为常量,是不应被改变的,所以定义时应在类型名前加上const。

2024-04-18 17:19:27 693

原创 常量数组的用法

相比普通数组,常量数组的优点在于性能更优:常量数组通常存储在程序的只读数据段中,由于其内容不会改变,编译器或运行时系统可能对其进行优化,从而提高访问速度并减少内存使用。输入对应数组的下标(索引),输出对应数组的元素。查找表(Lookup Table,简称LUT)是一种高效的数据结构,它通过预先存储输入到输出的映射关系,可以实现快速查找。下标对数组元素的映射关系可以是灵活的,比如可以很容易地通过上面的常量数组求出某月份前1个月的天数。比如在游戏中,通过常量数组可以设置难度等级对应的参数,比如敌人的血量。

2024-04-17 22:21:19 348

原创 将一个字符轮流替换为不同字符

其中getchar的作用是读入下一个字符。当发现双引号时利用一个值来回从1、0间切换的标志变量q,将双引号轮流替换为TeX式的左、右双引号。条件判断部分中的双引号是一个字符,因此用两个单引号包裹;替换后的双引号实际上是两个字符,所以应看成字符串,用双引号包裹,输出时也要按字符串的格式输出,即用%s。= EOF)这样的写法,这样能使代码显得更简洁,应将其视为模板记住。在TeX中,左双引号是“``”,右双引号是“''”。输入一篇包含双引号的文章,你的任务是把它转换成TeX的格式。2.字符和字符串的区别。

2024-04-16 17:22:39 414

原创 限定数字的“竖式”

找出所有形如abc*de(三位数乘以两位数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。此问题要求整个竖式出现的所有数字都包含于一个给定的数字集合中,因此解决问题的关键是判断一个数字是否存在于一串数字中,比如2在“2357”中存在,1则不存在。老金在match函数中利用了数字的ASCII码值比实际数字大48这个规律(比如数字0的ASCII码值为48),从而实现了int型与char型数字的比较。本来想输入直接用整数,不用字符串,但因为第一个数字可能为0,所以只好选择字符串的输入方式。

2024-04-15 17:15:21 422

原创 strlen有多长?

字符数组s的大小是10,并不是所有空间都用上了。赋值“hello”实际保存了6个字符(还有一个结束标记“\0”),但有效字符只有“hello”这5个,因此strlen(s)返回的是5(不包含“\0”)。函数strlen(s)的作用是获取字符串s的实际长度。就是有效字符的个数。

2024-04-15 15:10:37 134

原创 C语言数组的初始化方法大全

请注意,memset通常不适用于将非字节大小的值(如int, float, double等)初始化为非零值,因为它按字节填充,可能会导致未定义的行为。对于静态数组(全局数组或在函数之外的数组)和静态存储期的局部数组,如果没有明确初始化,它们会被自动初始化为0。这通常用于将数组初始化为0或其他重复值(如果数据类型允许)。只给数组的前面一部分元素赋值,剩余的元素会被自动初始化为0(对于基本数据类型)。:C99标准引入了指定初始化器,允许你初始化数组的特定元素。在声明数组的同时给出数组所有元素的值。

2024-04-14 22:12:32 200

原创 “蛇形填数”问题的三种解法

蛇形填数的三种解法,第一种简洁,第二种笨拙,第三种巧妙。

2024-04-14 22:06:33 862

原创 定义数组的注意事项

这个问题咱们在“数组定义在main函数内外的区别”和“定义在mian函数之外的数组的自动初始化”两篇文章中有详细的阐述。作为参加竞赛的同学,只要记得将数组定义在main函数之外就可以了。问题:读入一些整数,按读入顺序的逆序将这些数输出到一行中,中间用空格隔开。已知整数不超过100个。在算法竞赛中,常常难以精确计算出需要的数组大小。数组一般会声明得稍大一些。下标必须是常数,不能是变量。可以用define定义下标。

2024-04-13 22:53:33 352

原创 定义在mian函数之外的数组的自动初始化

第1个人把所有灯打开,第2个人按下所有编号为2的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯将被打开,开着的灯将被关闭),依此类推。输入n和k,输出开着的灯的编号。2.模拟开关灯的双层循环中的i表示第i个人,j表示第j盏灯,这就需要有一条if语句来判断是否要操作开关。其实根据题意可知,要操作的开关就是i的倍数,所以可以直接定义j为要操作开关的灯的编号,这样就不用增加if语句了。问题看似复杂,但有了数组这把利刃,解决起来非常容易,只需要用a[i]表示第i盏灯是否开着即可。

2024-04-12 20:07:06 344

原创 数组名的指针用法

注意相比之前的代码,这时n会多自加1次(因为n++写在while语句的循环条件判断中,当输入CTRL+Z结束时,n++又被执行了1次),所以for循环的初始值应改为n-2。需要特别说明的是,虽然数组名起到指针的作用,但它本质上只是一个常量指针。因为是常量,所以不能改变自己的值,因而改变地址时要用a+n,不能写成a++。因为数组名a起到指向数组首元素的指针的作用,所以可以通过a加上一个自加的n来返回数组各元素的地址,从而将输入的数据直接存入对应的地址中。其实可以直接将输入的数赋给数组,这就需要用到指针。

2024-04-12 19:06:08 459

原创 常用变量名合集

数学中通常用x,y来表示坐标,同样的,在命名变量时,可以使用一些具有特定含义的单个字符。prev:previous的简写,表示前一个元素或节点(链表、栈等)。item:表示数据结构中的一个单独元素(列表、数组、集合或队列等)timestamp:时间戳,表示一个特定的时间点或日期时间标记。handle:表示一个指向某种资源、对象或数据结构的引用或指针。i、j、k:常用于循环中的迭代变量,尤其在嵌套循环中。tail:表示数据结构的最后一个节点(链表、队列等)。head:表示数据结构的起始节点(链表、队列等)。

2024-04-11 19:18:17 574

原创 数组定义在main函数内外的区别

定义在函数外部的数组分配在静态存储区(static storage area)。因此,这样的数组称“全局数组”,具有全局作用域和静态存储期。定义在函数内部的数组分配在栈区(stack)。因此,这样的数组称“局部数组”,具有局部作用域和自动存储期。栈区相对较小,因此,如果你在main函数或任何其他函数中定义了一个非常大的数组,可能会超出栈的大小限制,导致栈溢出错误。小时候,我们总是习惯先写main函数,然后把变量都写在main函数里面。长大了,我们发现有时候把数组写在main函数内,会直接导致程序异常退出。

2024-04-11 16:46:34 338

原创 给我一点点,还你满屏爱!

老金反思:如果有人问,浮点数有没有误差,我肯定能秒回有。但当我看到一个浮点数,首先想到的只是一个数学中的小数,而没有第一时间想到它有误差。下面的程序运行结果是什么?=”运算符表示“不相等”。很不幸,老金又中招了。运行前不以为然,运行后肝肠寸断!当我看到“不要凭主观感觉回答”的提示,我没有在意。刘汝佳《算法竞赛入门经典》第二章 思考题2。我以为只会加100个0.1。验,不要凭主观感觉回答。浮点数有误差咋能忘记?

2024-04-10 20:29:42 377

原创 计算机的两大核心优势

1.计算优势:算得快、算得准、算得狠(不用休息,一直不停地算)。它对应程序中的算法。2.存储优势:储量大、查找快、不遗忘。它对应程序中的数据结构。程序=算法+数据结构。计算机=计算+存储。

2024-04-10 10:03:37 85

原创 数字排列的方法

9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。num[i]都赋值为1,再判断num[1]到num[9]的值,如果有值为0就说明该数字没有出现过。如果有数字出现次数大于1,必然有其他数字没出现,所以②与①是等价的。(2)数的避重:每生成一个数,都去与之前生成的所有数逐一比较是否相等,相等就跳过,不相等就再生成下一个数。就像之前说的,任一数字的出现次数不等于1,必然会导致有数字没出现。③分离成a、b、c、d、e、f、g、h、i,用于下一步判重。

2024-04-09 22:04:58 794

原创 动态输出n位小数——满满都是坑!

输入变量n,让你将一个数保留n位小数,看似简单的题目,却是深坑重重。

2024-04-08 18:46:31 1119

原创 隐藏在计算过程中的数据超限

(2)输出格式问题:输出格式要与样例严格一致,如Case和数字之间、冒号与输出值之间有且只有一个空格。,因此代码如果写成sum += 1.0/(i*i),大数相乘就会导致数据超限。(1)数据类型转换:输入的n、m为整数,而输出的结果为小数,需要转换数据类型,所以sum += 1.0/i/i中的1.0不能写成1。输入包含多组数据,结束标记为n=m=0。=n的形式不够简明,它其实等价于n。(3)数据超限问题:估计这就是题中所指的陷阱。(2)从n到m的遍历不用引入第3个变量,直接用n自加即可。

2024-04-07 10:11:11 348

原创 倒三角形的两种输出方法

思路是先求最大项,即第一行要输出的“#”数量(也就是等并数列的最后1项2n-1),以它为基准,其后每一项输出“#”的数量比前一项减2,输出的空格是(最大#数量-当前行#数量)/2。输出的三角形本质上是一个等差数列,关键是找到最后一个数与n的关系。首项为1,公差为2,显然第n项等于2n-1。只不过,这个等差数列要倒序输出。从输出的图形可以看出,每行输出的空格数是递增1的,由此可以利用累加器cnt++输出空格;“#”的输出数量则利用等差数列求第n项的公式求出。输入正整数n≤20,输出一个n层的倒三角形。

2024-04-06 21:11:59 242

原创 “韩信点兵”问题的数学真经

有一部数学真经叫《孙子算经》,产生了一个定理叫“中国剩余定理”,也叫“孙子定理”

2024-04-06 16:38:56 996

原创 能否直接比较不同类型的变量?

实际测试这个程序完全能够运行,并且运行结果正确,但在网上查的资料都说这样会导致编译器报错。能否直接判断一个int型变量与double型变量是否相等?老金有点懵,到底可不可以这样呢?

2024-04-05 23:15:48 82

原创 数据类型转换形式

显式类型转换,也称为强制类型转换,需要程序员明确指定要转换的目标类型。方法是在值或者变量前加带小括号的数据类型名(如“(int)”),即可将变量转换为指定的数据类型。当double类型的2.0与int类型的3进行除法运算时,编译器会自动将int类型的3转换为double类型,再与2.0进行运算。这很好理解,整型转换为浮点型不会丢失信息,而浮点型转换为整型会丢弃小数部分。注意括号只能加在类型名上,即只能写成(int)d,不能写成int(d)。编译器自动进行的类型转换,常发生在赋值操作或表达式求值时。

2024-04-05 23:00:48 349

原创 纯C++设置浮点数精度

当然了,如果在main函数前用了using namespace std;的话,代码中的std::就可以省去了,不过即便是这样,这种语法明显也比C语言麻烦的多。首先需要用到一个专用头文件<iomanip>,还需要用到一个流操作符setprecision,用于设置输出流中浮点数的精度。可见,用setprecision设置精度是包括整数部分的,即它指的是总的有效数字位数。如果你想要保留到小数点后几位,还需要引入另一个小伙伴:fixed。用纯C++语法输出固定位数小数的方法简直不要太麻烦。

2024-04-04 23:43:19 175

原创 不堪大用的pow

求x的y次幂的库函数pow(x,y),当x、y都是整数时,会产生计算误差吗?

2024-04-04 18:05:15 797

原创 “多组数据”题的注意事项,天杀的“鲁棒性”

在题目要求输入“多组数据”时,应该注意什么?对计算机术语“鲁棒性”的评论。

2024-04-03 17:04:33 1161

原创 永远留守在“输入缓冲区”里的孩子

(2)第2次执行for循环:当scanf从输入缓冲区读取完男生人数42后,再读取到一个类型不匹配的x时,它会把42赋值给male,而不会给fmale重新赋值。(1)第1次执行for循环:程序正常从输入缓冲区读取30 20,故male=30,fmale=20,male_count=30,female_count=20。第一行输入n表示有n个班,然后每行输入两个整数,表示每个班的男生、女生人数,用空格隔开。问题来了,如果在输入人数的过程中,误将整数输入成一个字母或小数,比如像下面这样,会出现什么情况呢?

2024-04-02 15:39:04 520

原创 非常绕的“输入结束”信号

那用什么发出“输入结束”信号,之前的文章“用恋爱脑搞懂scanf的返回值”已有介绍,在Windows下,输入完毕后按Enter键,然后按Ctrl+Z键,再按Enter键,即可结束输入。当输入完数据后,按Enter键再按下Ctrl+Z,然后再按下Enter,就会向当前正在执行scanf函数发出“输入结束”信号,当前scanf函数在没有任何有效输入的情况下结束输入。所以,准确地说,Ctrl+Z发出的“输入结束”信号是没有任何输入的“输入结束”信号。循环输入的代码很简单,但是用户的“输入结束”信号是什么呢?

2024-04-01 23:10:47 541

原创 条形图、柱状图的绘制方法

这个代码的实现还是很巧妙的,这里的i可视为纵坐标,从最大数依次递减,a[j]表示第j个柱状图的数据,所以当a[j]大于等于i时,就输出星号。第一行输入一个整数n表示数据个数,第二行输入n个整数,用空格隔开。n和输入的数都不超过20。样例中的柱状图属于水平柱状图,一般叫“条形图”,输出这种形式的柱状图还是比较容易的。一般我们说的柱状图都是指垂直柱状图,相比水平的条形图就要难一些了。1.条形图(水平柱状图)2.柱状图(垂直柱状图)

2024-03-31 22:35:54 330

原创 字符串的三种输入方法

新标准对这个函数进行了升级,加了个小尾巴,变成gets_s()。不过这个升级版不光造型上狗尾续貂,食用起来也是个鸡肋,因为有些编译器(比如GCC)根本不支持它。因为scanf会将空格识别为输入数据的分隔符,所以用它是不能输入含有空格的字符串的。,它会将其识别为两个字符串,上面的代码结果只会输出Hello。要替代gets(),你不得不把代码写成这样的复杂形式。注意getchar()返回值的类型是int型,它返回的是读取的字符的 ASCII 值。gets()函数的功能是将键盘输入的单行字符串保存到字符数组中。

2024-03-30 21:16:54 499

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除