大家好,我是紀寧。
今天是C語言筆試刷題訓練的第11天,加油!
文章目錄
- 1、聲明以下變量,則表達式: ch/i + (f*d – i) 的結果類型為( )
- 2、關于代碼的說法正確的是( )
- 3、已知有如下各變量的類型說明,則以下不符合C語言語法的表達式是( )
- 4、下面函數的輸出結果是( )
- 5、如下代碼的輸出結果是( )
- 最大連續 1 的個數
- 完全數計算(完數)
1、聲明以下變量,則表達式: ch/i + (f*d – i) 的結果類型為( )
char ch;
int i;
float f;
double d;
A: char B: int C: float D: double
基本數據類型的等級從低到高如下:char int long float double運算的時候是從低轉到高的,表達式的類型會自動提升或者轉
換為參與表達式求值的最上級類型,所以選D
2、關于代碼的說法正確的是( )
#include <stdio.h>
int main()
{int x = -1;unsigned int y = 2;if (x > y){printf("x is greater");}else{printf("y is greater");}return 0;
}
A: x is greater B: y is greater C: 依賴實現 D: 隨機
x是有符號數-1,內存中是全1,當有符號的x和無符號數進行比較時,x會隱式類型轉換被當做無符號數,是一個很大的數,
這時就選擇A了
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
4、下面函數的輸出結果是( )
void func()
{
int k = 1^(1 << 31 >> 31);printf("%d\n", k);
}
A: 0 B: -1 C: -2 D: 1
(1 << 31 );左移31位,并在右側填充0,得到0x80000000,即符號位為1,其他為0,即-2147483648
int k = 1^(1 << 31 >> 31);注意,這里在右移的時候,符號位保持為1,右移后填充1,結果為0xFFFFFFFF,即-1,
0x00000001^0xFFFFFFFF,即0xFFFFFFFE(-2),所以選D
5、如下代碼的輸出結果是( )
#include <stdio.h>
int main()
{int i = 1;sizeof(i++);printf("%d\n", i);return 0;
}
A: 1 B: 4 C: 2 D: 8
一般表達式的運算是在運行時執行的,而sizeof是一個編譯階段就執行的運算符,在其內的任何運算都不執行,只推測出其中
表達式結果的類型求其大小,故前后i的值不變,所以選A=
最大連續 1 的個數
給定一個二進制數組 nums , 計算其中最大連續 1 的個數。
int findMaxConsecutiveOnes(int* nums, int numsSize){int max=0,count=0;max=count;int*p=nums;while(numsSize--){if(*p==1){count++;p++;}else if(*p==0){count=0;p++;}if(count>max)max=count;}return max;
}
這道題思路比較簡單,統計連續1的個數,遇到0時表示連續中斷,判斷如果當前的統計數大于之前最大的則替換,然后繼續下一個位置開始的統計即可。要注意最后一個數組元素的判斷,很容易會將最后一個數組元素略過。
完全數計算(完數)
完全數(Perfect number),又稱完美數或完備數,是一些特殊的自然數。
它所有的真因子(即除了自身以外的約數)的和(即因子函數),恰好等于它本身。
例如:28,它有約數1、2、4、7、14、28,除去它本身28外,其余5個數相加,1+2+4+7+14=28。
輸入n,請輸出n以內(含n)完全數的個數。
輸入描述:輸入一個數字n
輸出描述:輸出不超過n的完全數的個數
#include<math.h>
#include <stdio.h>
int main(){int n = 0, count = 0, ret = 1;scanf("%d", &n);do{for (int i = 2; i <=sqrt(n); i++){if (n % i == 0){ret += i;if(i!=n/i)ret += n / i;}}if (ret == n)count++;ret = 1;} while (--n);printf("%d", count-1);
}
這道題的關鍵在于完全數的判斷:完全數指的是一個數字的所有約數的和和自身相等。我們只需要從 1 開始將這個數的約數相加求和即可。
約數就是能夠被數字整除,而這里簡化的一個思路是數字能夠被整除,則除數和結果就都是約數,這種思路下,只需要從1計算到平方根即可。
比如:數字 8 , 能夠整除 2 ,結果是 4 ,則除數 2 和結果 4 都是約數,而這兩個只需要一次計算判斷即可。需要注意的是 4,9,25… 這種,除數和結果相同的情況,則除數或者結果只相加一次就夠了。
而這段代碼其實是將1也算進去了,所以最后總數減1。