C语言之练习题

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


前言

今天是学校开学的第一天😊,真是个特殊的日子,步入写博客已经不知不觉有6个月了,我能感受写博客越来越从容了,那就让我俯视这我所热爱的一切。😎

在这里插入图片描述


填空题:

第一题

请问下列程序输出的结果是什么?

在这里插入图片描述

思路:无符号位char类型范围是:0~255
所以这题就是让我们寻找等于0的时候;
知道-211111110变成254;同理-111111111变成255,最后减到0的时候就跳出循环,不满足就继续循环;
7 4 1 -2 == > 共(7-1)/3+1=3次(1- 3 = -2,即254,继续循环)
254 251…5 2 -1 == > 共(254-2)/3+1=85次(2- 3 = -1 ,即255,继续循环 )
255 252…6 3 0 == > 共(255-5)/3+1=85次(3-3=0,退出循环)
所以一共循环了: 85+85+3=173次

第二题

请问下列程序输出的结果是什么?

在这里插入图片描述
思路:

这道题考察的是:隐式类型转换
x是有符号数-1,内存中是全1,当有符号的x和无符号数进行比较时,x会隐式类型转换被当做无符号数,是一个很大的数,所以会进入(x > y),且打印出:x is greater

第三题

在这里插入图片描述
思路:

我们首先要知道x|(x + 1)意味着什么?
假设x=3就是011,那么x+1=4就是100按照按位或|的运算原则:有1则为1,两者都为0,则为0;所以知道x|(x+1)111,从右往左数第一个0变成了1
总结:x|(x+1)作用是每次循环把x的二进制中从右往左数的最后一位0变成1;
x所有二进制位的都变成了1,那x+1就会溢出为0,循环结束;
2014的二进制序列是:0000 0000 000 0000 0000 0111 1101 1110,所以应该为23;

编程题:

第一题:不用加减乘除做加法


地址:oj地址


在这里插入图片描述
解题思路:

这道题考察的是:加法的运算原理
肯定要根据利用数据的二进制位来实现,那就需要运用了按位与&按位异或^
首先知道&的运算原则:有0则为0,两者都为1,则为1
^的运算原则:相同则为0,相异则为1;
如果用他们的二进制来计算:
假如不需要进位,则直接就可以得到答案:
51012010,不需要进位,则101 ^ 010等于1117
假如需要进位,则需要&找出需要进位值再进行<<1进位;
假设两个值 32,二进制分别为011010,结果应该为5,即101,那就来看二进制011 & 010,就可以找到需要进位的二进制位,再<<1,代表进1位;

知道了&的运算原则,那肯定可以用来进位的时候用;

代码实现:

int Add(int num1, int num2 ) {
    // write code here
    int tem=num1;
    while(num2)
    {
        tem=num1^num2;//不考虑进位
        num2=(num1&num2)<<1;//考虑进位
        
        num1=tem;
    }
    return tem;
}

第二题:完全数计算


地址:oj地址


在这里插入图片描述

解题思路:

思路:可以看出要为完全数,应该其所以的真因子之和要是该完全数的两倍;
要遍历该数的所有真因子在加起来,判断是否是该数的两倍,如果是那就是完全数,否则就不是;遍历完每个数记得将其记录真因子之和清空;

代码实现;

int main() {
    int n=0;
    scanf("%d",&n);
    int i=0;
    int count=0;//记录真因子之和
    int sum=0;//记录完全数的个数
    for(i=1;i<n;i++)
    {
        int j=0;
        for(j=1;j<=i;j++)
        {
            if(i%j==0)//是真因子就进入
            {
                count+=(i/j);
            }
        }
        if(count==2*i)//真因子之和是否为该数的两倍
        {
            sum++;
        }
        count=0;
    }

    printf("%d",sum);
    return 0;
}

第三题:单词倒排


地址:oj地址


在这里插入图片描述

解题思路:

思路:要满足题目要求的四个条件;
根据示例2:如果不是构成单词的字符只有26个大写或小写英文字母中的范围内,就打印空格.

如果要单词倒排,我们可以创造两个数组,一个数组存放的原输入的字符串,另一个数组用来存放倒排之后的字符串,然后打印出来就可以;

具体过程:
注意:设存放原输入的字符串的数组为 arr,另一个数组设为num;我们可以在输入进arr数组的时候就进行判断,如果不是 (构成单词的字符只有26个大写或小写英文字母)该范围里的,就输入一个空格‘ ’
设置一个指针指right向数组的最后一个元素,然后往前找空格,找到空格(记录该位置)就代表找到了最后一个单词的首字符,然后在依次输入num数组中,完成后,让指针又回到记录的那个空格的位置,判断是否为空格,如果是空格,就把空格输入num数组的同时指针right往前走,直到不是空格,这时指针指向的是倒数第二个单词的最后一个字符,然后后续按照上述的过程进行循环,直到将原来arr数组中的字符串全部都输入进了num数组,就跳出总循环;

代码实现:

#include <stdio.h>

int main() {
    char arr[10001];
    char num[10001];
    char ch = 0;
    int i = 0;
    int j = 0;
    while ((ch = getchar()) != '\n') {
        if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
            arr[i] = ch;
        else
            arr[i] = ' ';
        i++;
    }
    int right = i - 1;
    int count = 0;//记录这个单词多少个字节
    while (right >= 0) {
        //找到单词的开头位置
        while (arr[right] != ' ' && right >= 0) {
            count++;
            right--;
        }

        int tem = right;//记住这个位置
        while (count--) //输入num数组
        {
            num[j] = arr[right + 1];
            j++;
            right++;
        }

        right = tem;
        while (arr[right] == ' ') //如果是空格也传入num数组
        {
            num[j] = arr[right];
            right--;
            j++;
        }
        count = 0;//记得每次传完单词后要记录新的单词,这里要清0;
    }
    for (i = 0; i < j; i++) {
        printf("%c", num[i]);
    }
    return 0;
}

总结


到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 33
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值