简单编程题
1.下面代碼的結(jié)果是:
#include <stdio.h> int i; int main() {i--;if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0; }注:如果某個操作符的各個操作數(shù)屬于不同的類型,那么除非其中一個操作數(shù)的轉(zhuǎn)換為另一個操作數(shù)的類型,否則操作就無法進(jìn)行。下面的層次體系稱為尋常算術(shù)轉(zhuǎn)換。
long double double float unsigned long int long int unsigned int int如果某個操作數(shù)的類型在上面這個列表中排名較低,那么首先要轉(zhuǎn)換為另外一個操作數(shù)的類型后執(zhí)行運算。
int i;//全局變量如果沒有初始化,默認(rèn)會被初始化為0int main() {i--;//-1//sizeof是一個操作符,這個操作符返回的結(jié)果是size_t的,size_t是無符號整型//算術(shù)轉(zhuǎn)換//11111111111111111111111111111111//if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0; } //>2.統(tǒng)計二進(jìn)制中1的個數(shù)
寫一個函數(shù)返回參數(shù)二進(jìn)制中 1 的個數(shù)。
比如: 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.求兩個數(shù)二進(jìn)制中不同位的個數(shù)
編程實現(xiàn):兩個int(32位)整數(shù)m和n的二進(jìn)制表達(dá)中,有多少個位(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.打印整數(shù)二進(jìn)制的奇數(shù)位和偶數(shù)位
獲取一個整數(shù)二進(jìn)制序列中所有的偶數(shù)位和奇數(shù)位,分別打印出二進(jìn)制序列
//方法1 #include <stdio.h> int main() {int m = 0;scanf("%d", &m);int i = 0;//奇數(shù)位for (i = 30; i >= 0; i -= 2){printf("%d ", (m >> i) & 1);}printf("\n");//偶數(shù)位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("奇數(shù)位:");for (i = 31; i >= 1; i -= 2){printf("%d ", ((num >> i) & 1));}printf("\n");printf("偶數(shù)位:");for (i = 30; i >= 0; i -= 2){printf("%d ", ((num >> i) & 1));}return 0; }5.交換兩個變量(不創(chuàng)建臨時變量)
不允許創(chuàng)建臨時變量,交換兩個整數(shù)的內(nèi)容
#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.使用指針打印數(shù)組內(nèi)容
寫一個函數(shù)打印arr數(shù)組的內(nèi)容,不使用數(shù)組下標(biāo),使用指針。
arr是一個整形一維數(shù)組。
//方法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.寫一個函數(shù),可以逆序一個字符串的內(nèi)容。
#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是一個數(shù)字,
例如: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的數(shù)字:");scanf("%d", &a);sum = a + a * 11 + a * 111 + a * 1111;printf("sum=%d\n", sum);return 0; }9.打印水仙花數(shù)
求出0~100000之間的所有“水仙花數(shù)”并輸出。“水仙花數(shù)”是指一個n位數(shù),其各位數(shù)字的n次方之和確好等于該數(shù)本身,如:153=1^3+5^3+3^3,則153是一個“水仙花數(shù)”。
//方法1 #include <stdio.h> #include <math.h> int main() {int i = 0;for (i = 0; i <= 100000; i++){//判斷i是否為自冪數(shù)//1.計算i的位數(shù)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位數(shù)的水仙花 #include<stdio.h>int main() {int i;int a, b, c;//a為個位數(shù)字,b為十位數(shù)字,c為百位數(shù)字 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元,可以多少汽水(編程實現(xiàn))。
//方法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.調(diào)整奇數(shù)偶數(shù)順序
輸入一個整數(shù)數(shù)組,實現(xiàn)一個函數(shù),來調(diào)整該數(shù)組中數(shù)字的順序使得數(shù)組中所有的奇數(shù)位于數(shù)組的前半部分,所有偶數(shù)位于數(shù)組的后半部分。
#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實現(xiàn)
模擬實現(xiàn)庫函數(shù)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實現(xiàn)
模擬實現(xiàn)庫函數(shù)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.程序的執(zhí)行結(jié)果是多少?
int main() {unsigned char a = 200;//00000000000000000000000011001000//11001000 - aunsigned char b = 100;//00000000000000000000000001100100//01100100 - b unsigned char c = 0;c = a + b;//a和b都要發(fā)生整型提升//存放到c中要發(fā)生截斷////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.猜兇手
? ? ? 日本某地發(fā)生了一件謀殺案,警察通過排查確定殺人兇手必為4個嫌疑犯的一個。以下為4個嫌疑犯的供詞:A說:不是我。B說:是C。C說:是D。D說:C在胡說。
已知3個人說了真話,1個人說的是假話。現(xiàn)在請根據(jù)這些信息,寫一個程序來確定到底誰是兇手。
#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米臺跳水比賽,有人讓他們預(yù)測比賽結(jié)果:A選手說:B第二,我第三;B選手說:我第二,E第四;C選手說:我第一,D第二;D選手說:C最后,我第三;E選手說:我四,A第一;
比賽結(jié)束后,每位選手都說對了一半,請編程確定比賽的名次。
#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.不使用累計乘法的基礎(chǔ)上,通過移位運算(<<)實現(xiàn)2的n次方的計算。?
輸入描述:
一行輸入整數(shù)n(0 <= n < 31)。
輸出描述:
輸出對應(yīng)的2的n次方的結(jié)果。
#include <stdio.h> int main() {int n = 0;scanf("%d",&n);printf("%d\n", 1 << n);return 0; }20.公務(wù)員面試現(xiàn)場打分。有7位考官,從鍵盤輸入若干組成績,每組7個分?jǐn)?shù)(百分制),去掉一個最高分和一個最低分,輸出每組的平均成績。
輸入描述:
每一行,輸入7個整數(shù)(0~100),代表7個成績,用空格分隔。
輸出描述:
每一行,輸出去掉最高分和最低分的平均成績,小數(shù)點后保留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想獲得某年某月有多少天,請幫他編程實現(xiàn)。輸入年份和月份,計算這一年這個月有多少天。
#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; }總結(jié)
 
                            
                        - 上一篇: Folium库使用心得(一)
- 下一篇: 淘宝/天猫平台商品详情API接口调用说明
