C语言练习题(11)声明以下变量,则表达式: ch/i + (f*d – i) 的结果类型为( )(非常详细的讲解)

1:声明以下变量,则表达式: ch/i + (f*d – i) 的结果类型为( )

char ch;
int i;
float f;
double d;

A: char B: int C: float D: double

解析 D

在这个表达式中,首先进行了一次除法运算,即 ch/i,由于 i 是整型,所以进行整数除法,结果也是整型。 然后,进行了一次浮点数运算,即
f×d,由于 f 和 d 都是浮点型,所以进行浮点数乘法,结果也是浮点型。 最后,进行了一次混合运算,即 (fd - i),由于 f*d 的结果是浮点型,i 是整型,所以进行了浮点数减法,结果还是浮点型。

根据算术运算规则,在有浮点数参与的运算中,结果类型会被提升为最宽的操作数类型。在这个表达式中,最宽的操作数类型是 double,因为
double 的范围比 float 更广。所以,整个表达式的结果类型为 double。

2:关于代码的说法正确的是( )

#include 
int main()
{
int x = -1;
unsigned int y = 2;
if (x > y)
{
printf("x is greater");
} e
lse
{
printf("y is greater");
}
 return 0;
}

A: x is greater B: y is greater C: 依赖实现 D: 随机

解析 A

X和Y进行比较时

要将X也变为无符号整型
-1 的
原码 10000000 00000000 00000000 00000001
反码 11111111 11111111 11111111 11111110
补码 11111111 11111111 11111111 11111111
其无符号整形,最高位的1不代表正负,-1会被转换为一个很大的正整数。 因此-1>2 输出"x is greater"

3:已知有如下各变量的类型说明,则以下不符合C语言语法的表达式是( )

int k, a, b;
unsigned int w = 5;
double x = 1.42;

A: x%3 B: w+=-20 C: k=(a=200,b=300) D: a+=a-=a=9


解析 A

A 取余两边必须都为整数

B w=-20+w

C k=300

D a先等于9 然后把a-9的值给a 然后把a+(a-9)的值给a,最后输出为0

4:下面函数的输出结果是( )

void func()
{
int k = 1^(1 << 31 >> 31);
printf("%d\n", k);
}

A: 0 B: -1 C: -2 D: 1
解析 C

1 补码 00000000 00000000 00000000 00000001
1<<31后的补码
10000000 00000000 00000000 00000000
对于10000000 00000000 00000000 00000000,
其原码为: 11111111 11111111 11111111 11111111(取反) +1
原码的数字是-2147483648。

再将右移31位 11111111 11111111 11111111 11111111>>31
其符号位不变,右移结果为 10000000 00000000 00000000 00000001 表示-1

1与-1异或
00000000 00000000 00000000 00000001(1的原码补码反码相同)
10000000 00000000 00000000 00000001(-1的原码)
11111111 11111111 11111111 11111111(-1的补码)
结果为:11111111 11111111 11111111 11111110(异或后的补码)
10000000 00000000 00000000 00000010(异或后的原码)-2

5:如下代码的输出结果是( )

#include 
int main()
{
int i = 1;
sizeof(i++);
printf("%d\n", i);
return 0;
} 

A: 1 B: 4 C: 2 D: 8
解析 A

在这段代码中,sizeof(i++)是一个表达式,它计算并返回i++的大小(字节数)。
但是,sizeof运算符是在编译时求值的,它不会对i++进行实际的递增操作。 因此,sizeof(i++)不会改变i的值。
所以,sizeof(i++)的结果是sizeof(int),即4(假设int类型的大小为4个字节)。但是不改变i的值。
因此,当输出i的值时,仍然是原来的值1。

6:给定一个二进制数组 nums , 计算其中最大连续 1 的个数。

示例 1:
输入:nums = [1,1,0,1,1,1]
输出:3
解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.

示例 2:
输入:nums = [1,0,1,1,0,1]
输出:2

核心代码版:

int findMaxConsecutiveOnes(int* nums, int numsSize)
{
    int count=0;
    int max_count=0;
   for (int i=0;i<numsSize;i++)
   {
       if (nums[i]==1)
       {
           count++;
       }
       else
       {
           max_count=fmax(max_count,count);//比较上次的最大值和重新累计的最大值
            count=0;//重置
       }

   }
   max_count=fmax(max_count,count);//比较循环中的最大值和最后一次统计的最大值
   return max_count;
}

完整代码版:

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
int main()
{
int n = 0;
scanf("%d", &n);
int arr[10000] = { 0 };
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int count = 0;
int max_count = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] == 1)
{
count++;
}
else
{
max_count =(int) fmax(max_count, count);
count = 0;
}
}
max_count =(int) fmax(max_count, count);
printf("%d", max_count);
return 0;
}

解析

①首先,定义了两个变量count和max_count,分别用于统计当前连续1的个数和记录最大的连续1的个数。

②接下来进入一个循环,遍历数组中的元素。如果当前元素是1,说明发现了一个连续的1,将count加1。如果当前元素是0,说明连续1的序列结束,需要判断是否更新max_count。使用fmax函数比较max_count和count,选择较大的值作为新的最大值。然后将count重置为0,准备统计下一个连续1的个数。

③在循环结束后,还需要再次使用fmax函数比较循环中的最大值和最后一次统计的最大值,以确保返回的结果是最大的连续1的个数。

最后,函数返回max_count作为结果。

7:完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。

它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。

例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
输入n,请输出n以内(含n)完全数的个数。

数据范围: 1≤n≤5×10 ^5
输入描述:输入一个数字n
输出描述:输出不超过n的完全数的个数
示例1
输入:1000
输出:3

#include 
int main() 
{
    int number;
    scanf("%d",&number);
    int sum=0;
    int count=0;
    while (number) 
    {
        sum = 0;
        for (int i = 1; i < number; i++)
        {
            if (number % i == 0) 
            {
                sum =sum + i;
            }
            if (sum == number && i == number - 1) 
            {
                count++;
                break;
            }
        }
        number--;
    }
    printf("%d", count);
    return 0;
    }

如果题目要求多组输入,我们进行以下更改
在外层加入了一个while循环,t表示输入几组数据,即可进行多组输入

#define _CRT_SECURE_NO_WARNINGS 1
#include 

int main()
{
    int t;
    scanf("%d", &t);
    while (t--)
    {
        int number;
        scanf("%d", &number);
        int sum = 0;
        int count = 0;
        while (number)
        {
            sum = 0;
            for (int i = 1; i < number; i++)
            {
                if (number % i == 0)
                {
                    sum = sum + i;
                }
                if (sum == number && i == number - 1)
                {
                    count++;
                    break;
                }
            }
            number--;
        }
        printf("%d ", count);
    }
    return 0;
}

解析

①代码首先通过scanf函数从用户输入获取一个数字,并将其存储在number变量中。然后定义了两个变量sum和count,分别用于存储因子之和和完数的个数。

②接着使用一个while循环,循环条件为number不为0。循环的目的是遍历从输入数字到1的所有数字。

在每次循环迭代中,将sum重置为0。
③然后使用一个for循环,遍历从1到number-1之间的所有数字,并判断number是否能被当前数字整除。如果能整除,则将当前数字加到sum中。这是用来判断最后是否除数字本身外,其他约数之和是否等于数字。

④在for循环结束后,如果sum等于number并且i等于number-1,即当前数字是完数,将count加1,并使用break退出for循环。

⑤最后,将number减1,然后继续下一次循环。直到判断完数字0。

值得注意的是这里用到了一个fmax函数,该函数的头文件是,用于输出两个数中的较大数,其本身为double类型,我将其转换为了int类型。

!!!!!此题还有一个较为炸裂的偷懒方法

#include 
 
int main()
{
        int n;
        scanf("%d", &n);
        if(n < 28)
                printf("1");
         if(n < 496 && n >= 28)
                printf("2");
         if(n < 8128 && n >= 496)
                printf("3");
        return 0;
}

这就属于拿着答案做题了,给大家乐呵乐呵,做题时还是不要这个样子哦。

你可能感兴趣的:(c语言,算法,开发语言)