char ch;
int i;
float f;
double d;
解析 D
在这个表达式中,首先进行了一次除法运算,即 ch/i,由于 i 是整型,所以进行整数除法,结果也是整型。 然后,进行了一次浮点数运算,即
f×d,由于 f 和 d 都是浮点型,所以进行浮点数乘法,结果也是浮点型。 最后,进行了一次混合运算,即 (fd - i),由于 f*d 的结果是浮点型,i 是整型,所以进行了浮点数减法,结果还是浮点型。
根据算术运算规则,在有浮点数参与的运算中,结果类型会被提升为最宽的操作数类型。在这个表达式中,最宽的操作数类型是 double,因为
double 的范围比 float 更广。所以,整个表达式的结果类型为 double。
#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和Y进行比较时
要将X也变为无符号整型
-1 的
原码 10000000 00000000 00000000 00000001
反码 11111111 11111111 11111111 11111110
补码 11111111 11111111 11111111 11111111
其无符号整形,最高位的1不代表正负,-1会被转换为一个很大的正整数。 因此-1>2 输出"x is greater"
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
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 表示-11与-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
#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。
示例 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作为结果。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如: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函数,该函数的头文件是
!!!!!此题还有一个较为炸裂的偷懒方法
#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;
}
这就属于拿着答案做题了,给大家乐呵乐呵,做题时还是不要这个样子哦。