• C语言牛客网(NowCoder)刷题篇


    大家好我是沐曦希💕


    给大家介绍一款超牛的斩获大厂offer利器——牛客网
    在这里插入图片描述

    1.数字颠倒

    题目链接:HJ11 数字颠倒
    在这里插入图片描述

    思路

    这道题只需要循环取出一个数字的每一位进行单独打印,打印完毕后换行即可。而获取数据的每一位,可以通过取每次对数字模和除以 10 来完成。
    示例: 129 , 129%10 得到 9 , 129/10 得到 12 ,循环进行操作直到数字除以 10 得到 0 为止。

    代码

    #include 
    int main()
    {
    	int num;
    	while(~scanf("%d", &num)) 
    	{
    		if (num == 0) 
    		{//0的情况特殊处理,因为0不会进入while循环计算余数,因此不会被打印
    			printf("%d", num % 10);
    			continue;
    	    } 
    		while(num > 0) 
    		{
    			printf("%d", num % 10);//打印一个数字的个位数 129 % 10 得到9
    			num /= 10;//通过除以10的方式去掉个位数 例如:129/10 得到12
    		} 
    		printf("\n");
    	} 
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.不用加减乘除做加法

    题目链接:JZ65 不用加减乘除做加法
    在这里插入图片描述

    思路

    十进制相加思想: 15+07 , 先计算不考虑进位的相加结果 12 (因为 5+7 的不考虑进位的结果是 2 ,遇 10 进位),然后计算进位 5+7 进位是 10 ,则 10 与 12 再次相加,得到 22 ,进位为 0 ,则计算到此结束。
    这里使用二进制求和完成,思想类似,但是二进制计算相加和进位不需要使用 + 符号二进制相加思想:与十进制相同,先计算不考虑进位的相加结果( 0+0 得 0 , 1+1 进位得 0 , 1+0 得 1 ),使用异或可以取得; 然后计算相加的进位结果(同 1 的位置左移一位即可),使用相与后左移取得。
    示例:

    5 0101 + 7 0111
    不考虑进位的相加结果 0101^0111 -> 0010
    相加的进位 0101&0111 -> 0101 因为进位左移得到 1010
    1010 + 0010
    不考虑进位的相加结果 1010 ^ 0010 -> 1000
    相加的进位 1010 & 0010 -> 0010 因为进位左移得到 0100
    1000 + 0100
    不考虑进位的相加结果 1000 ^ 0100 -> 1100
    相加的进位 1000 & 0100 -> 0000 进位为0结束运算
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    代码

    int Add(int num1, int num2 )
     {
    	while(num2 != 0) 
    	{//进位不为0则持续与相加结果进行相加
    		int tmp = num1 ^ num2;//得到每位相加不考虑进位的数据
    		num2 = (num1 & num2) << 1;//同1的位相加则会进位
    		num1 = tmp;
    	}
    	 return num1;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.字符个数统计

    题目链接:HJ10 字符个数统计
    在这里插入图片描述

    思路

    因为题目圈定出现的字符都是 ascii 值小于127的字符,因此只需要定义一个标记数组大小为127 ,然后将字符作为数组下标在数组中进行标记,若数组中没有标记过表示第一次出现,进行计数,否则表示重复字符。
    示例:查表法, “aca” ,首先把a字符( ascii 值为 97 )作为下标,将标记数组的第 97 位置 1 ,下次如果还有 a 字符出现,到下标 ‘a’ 或者 97 的位置一看是1就表示a已经统计过了。

    代码

    #include 
    int main()
    {
    	char tmp[501] = {0};
    	while(~scanf("%s", tmp)) 
    	{
    		char table[128] = {0}, *ptr = tmp;
    		int count = 0;
    		while(*ptr != '\0')
    		 {
    			if (table[*ptr] != 1) 
    			{//判断字符ascii值作为下标的位置是否被标记过,是否是重复字符
    				count++; //当前字符的位置没有被标记过表示没有出现过,则计数+1
    			} 
    			table[*ptr++] = 1;//将字符ascii值作为下标的位置进行标记置1
    		}
    		 printf("%d\n", count);
    	} 
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    4.写在最后

    那么就到这里了。
    在这里插入图片描述

  • 相关阅读:
    进程间的通信方式简介
    一文极速理解深度学习
    本地安装多个node版本,gvnm来安装切换使用。vue2和vue3对node版本要求不一样
    数字化赋能半导体行业,B2B撮合系统助力企业缩短交易链路,实现高效供需匹配
    关于C++拷贝控制
    联想服务器-HTTP boot安装Linux系统
    R语言使用oneway.test函数执行单因素方差分析(One-Way ANOVA)、使用aov函数执行单因素方差分析(aov函数默认组间方差相同)
    springboot建筑造价师资格考试应试网站设计与实现毕业设计源码260839
    linux设置tomcat redis开机自启动
    Python——函数
  • 原文地址:https://blog.csdn.net/m0_68931081/article/details/126498284