C小白学习博客日记#04

文章讲述了编程中的一些常见问题和解决方案,包括判断素数的方法,优化时间复杂度的策略,malloc函数的工作原理,二进制与其他进制的相互转化,以及字符串翻转的不同实现。同时讨论了二维数组的存储方式和函数返回多值的策略,如使用pair或自定义结构体。
摘要由CSDN通过智能技术生成

1.在判断素数的时候,往往会使用for循环,要注意for里的初始变量要从2或3开始,写完程序后要记得检验1,2,3是否成立。

2.在判断素数的时候,往往需要思考如何减小时间复杂度,一种是使用sqrt函数,i < sqrt + 1;

还有一种是

int prime(int n)
{
    int i;
	for (i=2; i<=n/i; i++)
		if(n%i == 0)
			return 0;
	return 1;

}

这个不用调用sqrt函数计算,从时间上应该是更加的简单。

3.使用switch函数时,每个case后面记得要加一个break,不然会继续执行下面的case,用一个比喻来描述的话,case相当于入口,break相当于程序的出口,如果不写出口的话,程序会一直执行下去。

4.关于malloc函数的思考

malloc函数是动态内存,往往与静态数组相对照,静态数组是一块儿连续的空间,每个字节之间都是连续的,而malloc函数不要求连续的空间,见缝插针的感觉。但是这样会在使用时遇到一个问题,p = (int *)malloc(sizeof(int) * n), *p 为第一个字节的地址,*p 等价于 *(p+0)等价于p[0]。那么*(p+1)呢,笔者的理解是,malloc是把一些不连续的内存,提取聚合成一段连续的内存,一个动态数组,*(p+1)就是malloc函数里的第二个空间,即p[1]。这是笔者由果索因的思考,不知道是否正确。

5.二进制与十进制即其他进制间的相互转化

二进制转化为十进制,从小到大, 依次与1,2,2*2,2*2*2......相乘,需要注意二进制数往往很长,因此可以使用long long(%lld)或long int(%ld)来进行储存其值。

int convertBinaryToDecimal(long long n)
{
    int decimalNumber = 0, i = 0, remainder;
    while (n!=0)
    {
        remainder = n%10;
        n /= 10;
        decimalNumber += remainder*pow(2,i);
        ++i;
    }
    return decimalNumber;
}

十进制转化为二进制,使用短除法,不断除二,直至商为1或0,然后倒序写余数。

 while (number != 0)
	{
       result[i] = number%2;
	   number /= 2;
	   i++;
	}

	   for (j=i-1; j>=0;j--)
		   printf("%d", result[j]);

 笔者对于其他进制的转化,采用的是间接转化,先将已知的转化为十进制,然后在进行转化,

6.字符串的翻转

这里有许多方法,一种是使用巧妙地递归来实现

void reverseSentence()
{
    char c;
    scanf("%c", &c);
 
    if( c != '\n')
    {
        reverseSentence();
        printf("%c",c);
    }
}
void reverseStr(char* str)
{
     if(*str=='\0') return;
     reverseStr(str+1);
     printf("%c",*str);
}

 

 还有一种是借用了strlen函数(在#include<string.h>中),通过这个函数可以计算出数组里到\0为止前的空间个数,即字符个数,然后运用for循环将字符数组倒序输出,实现翻转的功能。


    char c[40];
    int i=1;
    int j=strlen(c);
    do{
        printf("%c",c[j-i]);
        ++i;
    } while(i<=j);
 

7.关于二维数组的疑惑,二维数组如a[3][4]是连续的12个空间吗,还是一个有3个连续的空间,加上3段有4个空间的空间吗,如何用指针变量来实现其值的表示呢(在跨函数调用以及改变值时使用)?

8.在函数返回值时,往往只能返回一个值,当返回两个值时,可以使用pair,pair的本质是一个结构体,那么根据这个,当需要返回多个值时,可以自己定义一个结构体,然后返回值(笔者还没实验过,此处纸上谈兵)。

pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。
————————————————
版权声明:本文为CSDN博主「sevencheng798」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sevenjoin/article/details/81937695

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习C语言对于初学者来说,可以按照以下步骤来进行: 1. **理解基础知识**:开始之前,了解计算机基本概念如内存、数据类型、变量等。了解计算机是如何运作的以及C语言的基本结构是很重要的。 2. **选择教程或资源**:选择一本适合初学者的C语言教材,例如 "C Programming: A Modern Approach" 或者在线资源如C语言官方文档和Codecademy的教程。 3. **环境配置**:安装一个C编译器,比如GCC(GNU Compiler Collection),并学会使用文本编辑器(如Notepad++或Visual Studio Code)编写和运行C代码。 4. **语法入门**:从C语言的基础语法开始,比如变量声明、数据类型(如整型、浮点型、字符型)、运算符、控制结构(条件语句和循环)等。 5. **练习编写小程序**:通过编写简单的程序,如计算器、猜数字游戏等,来加深对语言的理解和实践。 6. **函数和数组**:学习函数的定义、调用以及数组的使用,这是C程序组织的关键。 7. **面向对象编程**:尽管C不是纯面向对象的语言,但理解指针和结构体,以及函数指针能让你接触到面向对象的元素。 8. **错误处理和输入输出**:学习如何处理程序中的错误,以及标准输入输出(如scanf和printf)的使用。 9. **阅读他人代码**:找一些开源项目来阅读,这有助于理解实际开发中C语言的应用。 10. **持续学习和实践**:编程是实践出真知,多做项目,不断调试和优化代码,逐渐提升编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值