简单编程题
1.下面代碼的結果是:
#include <stdio.h> int i; int main() {i--;if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0; }注:如果某個操作符的各個操作數屬于不同的類型,那么除非其中一個操作數的轉換為另一個操作數的類型,否則操作就無法進行。下面的層次體系稱為尋常算術轉換。
long double double float unsigned long int long int unsigned int int如果某個操作數的類型在上面這個列表中排名較低,那么首先要轉換為另外一個操作數的類型后執行運算。
int i;//全局變量如果沒有初始化,默認會被初始化為0int main() {i--;//-1//sizeof是一個操作符,這個操作符返回的結果是size_t的,size_t是無符號整型//算術轉換//11111111111111111111111111111111//if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0; } //>2.統計二進制中1的個數
寫一個函數返回參數二進制中 1 的個數。
比如: 15????0000 1111????4 個 1
//方法1 #include <stdio.h> int NumberOf1(int n) {int i = 0;int count = 0;for (i = 0; i < 32; i++){if (((n >> i) & 1) == 1){count++;}}return count++; } int main() {int n = 0;scanf("%d", &n);int ret = NumberOf1(n);printf("%d\n", ret);return 0; } //方法2 #include <stdio.h> int NumberOf1(int n) {int count = 0;while (n){if (n % 2 == 1)count++;n /= 2;}return count; } int main() {int n = 0;scanf("%d", &n);int ret = NumberOf1(n);printf("%d\n", ret);return 0; } //n=n&(n-1) //n=13 //1101 - n //1100 - n-1 //1100 - n //1011 - n-1 //1000 - n //0111 - n-1 //0000 - n // //方法3 #include <stdio.h> int NumberOf1(int n) {int count = 0;while (n){n = n & (n - 1);count++;}return count++; } int main() {int n = 0;scanf("%d", &n);int ret = NumberOf1(n);printf("%d\n", ret);return 0; }3.求兩個數二進制中不同位的個數
編程實現:兩個int(32位)整數m和n的二進制表達中,有多少個位(bit)不同??
輸入例子:1999 2299? ? ? 輸出例子:7
//方法1 #include <stdio.h> int main() {int m = 0;int n = 0;scanf("%d %d", &m, &n);int i = 0;int diff = 0;for (i = 0; i < 32; i++){if (((m >> i) & 1) != ((n >> i) & 1)){diff++;}}printf("%d\n", diff);return 0; } //方法2 #include <stdio.h> int main() {int m = 0;int n = 0;scanf("%d %d", &m, &n);int i = 0;int diff = 0;int tmp = m ^ n;//異或,相同為0,不同為1while (tmp){tmp = tmp & (tmp - 1);diff++;}printf("%d\n", diff);return 0; }4.打印整數二進制的奇數位和偶數位
獲取一個整數二進制序列中所有的偶數位和奇數位,分別打印出二進制序列
//方法1 #include <stdio.h> int main() {int m = 0;scanf("%d", &m);int i = 0;//奇數位for (i = 30; i >= 0; i -= 2){printf("%d ", (m >> i) & 1);}printf("\n");//偶數位for (i = 31; i >= 1; i -= 2){printf("%d ", (m >> i) & 1);}return 0; } //方法2 #include<stdio.h> int main() {int num = 0;int i = 0;scanf("%d", &num);printf("奇數位:");for (i = 31; i >= 1; i -= 2){printf("%d ", ((num >> i) & 1));}printf("\n");printf("偶數位:");for (i = 30; i >= 0; i -= 2){printf("%d ", ((num >> i) & 1));}return 0; }5.交換兩個變量(不創建臨時變量)
不允許創建臨時變量,交換兩個整數的內容
#include <stdio.h> int main() {int a = 10;int b = 20;printf("交換前:a = %d b = %d\n", a, b);a = a ^ b;b = a ^ b;a = a ^ b;printf("交換后:a = %d b = %d\n", a, b);return 0; }6.使用指針打印數組內容
寫一個函數打印arr數組的內容,不使用數組下標,使用指針。
arr是一個整形一維數組。
//方法1 #include <stdio.h> void print(int *p,int sz) {int i = 0;for (i = 0; i < sz; i++){printf("%d ", *(p + i));} } int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);return 0; } //方法2 #include <stdio.h> int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int i = 0;for (i = 0; i < 10; i++){printf("%d ", *(p + i));}return 0; } //方法3 #include <stdio.h> void print(int* p, int sz) {int i = 0;for (i = 0; i < sz; i++){printf("%d ", *p);p++;} } int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);print(arr, sz);return 0; }7.寫一個函數,可以逆序一個字符串的內容。
#include <stdio.h> #include <string.h>int main() {char arr[10000] = { 0 };//i am a student//scanf("%s",arr);scanf不能讀取空格gets(arr);//逆序int len = strlen(arr);char* left = arr;char* right = arr + len - 1;while (left < right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}printf("%s\n", arr);return 0; }8.計算求和
求Sn=a+aa+aaa+aaaa+aaaaa的前5項之和,其中a是一個數字,
例如:2+22+222+2222+22222
//方法1 #include <stdio.h> int main() {int a = 0;int n = 0;scanf("%d %d", &a, &n);//2 5int i = 0;int sum = 0;int k = 0;//2+22+222+2222+22222for (i = 0; i < n; i++){k = k * 10 + a;sum += k;}printf("%d\n", sum);return 0; } //方法2 #include <stdio.h> int main() {int a = 0;int sum = 0;printf("請輸入一個0-9的數字:");scanf("%d", &a);sum = a + a * 11 + a * 111 + a * 1111;printf("sum=%d\n", sum);return 0; }9.打印水仙花數
求出0~100000之間的所有“水仙花數”并輸出。“水仙花數”是指一個n位數,其各位數字的n次方之和確好等于該數本身,如:153=1^3+5^3+3^3,則153是一個“水仙花數”。
//方法1 #include <stdio.h> #include <math.h> int main() {int i = 0;for (i = 0; i <= 100000; i++){//判斷i是否為自冪數//1.計算i的位數int n = 1;int tmp = i;while (tmp /=10){n++;}//2.計算每一位的n的次方之和tmp = i;int sum = 0;while (tmp)//1234{sum += (int)pow(tmp % 10, n);tmp /=10;}//比較if (sum == i){printf("%d ", i);}}return 0; } //求3位數的水仙花 #include<stdio.h>int main() {int i;int a, b, c;//a為個位數字,b為十位數字,c為百位數字 for (i = 100; i < 1000; i++){a = i % 10;b = i / 10 % 10;c = i / 100;if (i == (a * a * a + b * b * b + c * c * c)){printf("%d\n", i);}}return 0; }10.打印菱形
#include <stdio.h> int main() {int n = 0;scanf("%d", &n);//打印上半部分nint i = 0;for (i = 0; i < n; i++){//打印一行//打印空格int j = 0;for (j = 0; j < n - 1 - i; j++){printf(" ");}//打印*for (j = 0; j < 2 * i + 1; j++){printf("*");}printf("\n");}//打印下半部分for (i = 0; i < n-1; i++){//打印一行//打印空格int j = 0;for (j = 0; j <= i; j++){printf(" ");}//打印*for (j = 0; j < (n-1-i)*2-1; j++){printf("*");}printf("\n");}return 0; }11.喝汽水問題
喝汽水,1瓶汽水1元,2個空瓶可以換一瓶汽水,給20元,可以多少汽水(編程實現)。
//方法1 #include <stdio.h> int main() {int money = 0;scanf("%d", &money);//20int total = money;int empty = money;//置換while (empty >= 2){total+= (empty / 2);empty = empty / 2 + empty % 2;}printf("%d\n", total);return 0; } //方法2 #include <stdio.h> int main() {int money = 0;scanf("%d", &money);int total = 0;if (money <= 0){total = 0;}else{total = money * 2 - 1;}printf("%d\n", total);return 0; }12.調整奇數偶數順序
輸入一個整數數組,實現一個函數,來調整該數組中數字的順序使得數組中所有的奇數位于數組的前半部分,所有偶數位于數組的后半部分。
#include <stdio.h> void move(int arr[], int sz) {int left = 0;int right = sz - 1;while (left < right){while ((left < right) && (arr[left] % 2 == 1)){left++;}while ((left < right) && (arr[right] % 2 == 0)){right--;}if (left < right){int tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;}} } void print(int arr[], int sz) {int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);} } int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);move(arr, sz);print(arr, sz);return 0; }13.strlen實現
模擬實現庫函數strlen
#include <stdio.h> #include <assert.h> my_strlen(const char* str) {int count = 0;assert(str != NULL);while (*str != '\0'){str++;count++;}return count; } int main() {int len= my_strlen("abcdef");printf("%d\n", len);return 0; }14.strcpy實現
模擬實現庫函數strcpy
#include <stdio.h> #include <string.h> int main() {char arr1[] = "abcdef";char arr2[] = { 0 };strcpy (arr2, arr1);printf("%s\n", arr2);return 0; }15.程序的執行結果是多少?
int main() {unsigned char a = 200;//00000000000000000000000011001000//11001000 - aunsigned char b = 100;//00000000000000000000000001100100//01100100 - b unsigned char c = 0;c = a + b;//a和b都要發生整型提升//存放到c中要發生截斷////00000000000000000000000011001000//00000000000000000000000001100100//00000000000000000000000100101100////00000000000000000000000000101100 - cprintf(" %d %d", a + b, c);return 0; } //300 4416.楊輝三角
//1 //1 1 //1 2 1 //1 3 3 1 //1 4 6 4 1#include <stdio.h> int main() {int arr[10][10] = { 0 };int i = 0;for (i = 0; i < 10; i++){int j = 0;for (j = 0; j < 10; j++){if (j == 0)arr[i][j] = 1;if (i == j)arr[i][j] = 1;if (i >= 2 && j >= 1)arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];}}for (i = 0; i < 10; i++){int j = 0;int k = 0;for (k = 0; k < 10 - i; k++){printf(" ");}for (j = 0; j <= i; j++){printf("%d ", arr[i][j]);}printf("\n");}return 0; }17.猜兇手
? ? ? 日本某地發生了一件謀殺案,警察通過排查確定殺人兇手必為4個嫌疑犯的一個。以下為4個嫌疑犯的供詞:A說:不是我。B說:是C。C說:是D。D說:C在胡說。
已知3個人說了真話,1個人說的是假話。現在請根據這些信息,寫一個程序來確定到底誰是兇手。
#include <stdio.h> int main() {int killer = 0;//a b c dfor (killer = 'a'; killer <= 'd'; killer++){if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer!='d') == 3){printf("%c\n",killer);}}return 0; }18.猜名次
? ? ? 5位運動員參加了10米臺跳水比賽,有人讓他們預測比賽結果:A選手說:B第二,我第三;B選手說:我第二,E第四;C選手說:我第一,D第二;D選手說:C最后,我第三;E選手說:我四,A第一;
比賽結束后,每位選手都說對了一半,請編程確定比賽的名次。
#include <stdio.h> int main() {int a = 0;int b = 0;int c = 0;int d = 0;int e = 0;for (a = 1; a <= 5; a++){for (b = 1; b <= 5; b++){for (c = 1; c <= 5; c++){for (d = 1; d <= 5; d++){for (e = 1; e <= 5; e++){if (((b == 2) + (a == 3) == 1) &&((b == 2) + (e == 4) == 1) &&((c == 1) + (d == 2) == 1) &&((c == 5) + (d == 3) == 1) &&((e == 4) + (a == 1) == 1)){if(a*b*c*d*e == 120)printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);}}}}}}return 0; }19.不使用累計乘法的基礎上,通過移位運算(<<)實現2的n次方的計算。?
輸入描述:
一行輸入整數n(0 <= n < 31)。
輸出描述:
輸出對應的2的n次方的結果。
#include <stdio.h> int main() {int n = 0;scanf("%d",&n);printf("%d\n", 1 << n);return 0; }20.公務員面試現場打分。有7位考官,從鍵盤輸入若干組成績,每組7個分數(百分制),去掉一個最高分和一個最低分,輸出每組的平均成績。
輸入描述:
每一行,輸入7個整數(0~100),代表7個成績,用空格分隔。
輸出描述:
每一行,輸出去掉最高分和最低分的平均成績,小數點后保留2位,每行輸出后換行。
#include <stdio.h> int main() {int i = 0;int score = 0;int max = 0;int min = 100;int sum = 0;for (i = 0; i < 7; i++){scanf("%d", &score);if (score > max){max = score;}if (score < min){min = score;}sum += score;}printf("%.2f\n", (sum - max - min) / 5.0);return 0; }21.KiKi想獲得某年某月有多少天,請幫他編程實現。輸入年份和月份,計算這一年這個月有多少天。
#include <stdio.h> int main() {int y = 0;int m = 0;int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };while (scanf("%d %d", &y, &m) == 2){int day = days[m - 1];if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)){if (m == 2)day += 1;}printf("%d\n", day);}return 0; }總結
- 上一篇: Folium库使用心得(一)
- 下一篇: 淘宝/天猫平台商品详情API接口调用说明