C語言面試題

面試題 

// 經典1面試



    //隨機產生20個[10,50]的正整數存到數組中,並求出數組中的全部元素最大值,最小值,平均值以及個元素之和,及第二大值
    int a[20] = {0};
    printf("隨機產生的元素:\n");
    for (int i = 0; i < 20; i++) {
        a[i] = arc4random() % (50 - 10 +1) + 10;
        printf("%d  ",a[i]);
    }
    printf("\n");
    //求全部元素的最大值
    int max = 0;
    for (int i = 0; i < 20; i++) {
        if (a[i] > max) {
            max = a[i];
        }
    }
    printf("max = %d\n", max);
    //求全部元素的最小值
    int min = a[0];
    for (int i = 1; i < 20; i++) {
        if (min > a[i]) {
            min = a[i];
       }
    }
    printf("min = %d\n", min);
    //求全部元素的和
    int sum = 0;
    for (int i = 0; i < 20; i++) {
        sum += a[i];
    }
    printf("sum = %d\n", sum);
    //求全部元素的平均值
    float mid = 0;
    mid = sum / 20;
    printf("mid = %.2f\n", mid);
    //求第二大值
    int smax = 0;
    for (int i = 0; i < 20; i++) {
        if (smax < a[i] && a[i] < max) {
            smax = a[i];
        }
    }
    printf("smax = %d", smax);
    // 經典2
    //編程在一個已知的字符串中查找最長單詞,假定字符串只含字母和空格,用空格來分隔單詞
    //思路:
    //主要是判斷單詞,連續的字母,就假定爲一個單詞,從讀取到第一個字母開始計數,而後直接遇到空格,爲一個單詞的長度,用一個變量記錄,最長單詞的長度,若是要輸出最長的單詞,通常是放在數組裏面,記住下標.
    char targetString[] = "I come china";
    int maxLength = 0;//最長長度
    int currentLength = 0;//當前獲得的單詞的長度
    int maxIndex = 0;//當前最長單詞的起始下標
    int tempArray[200] = {0};
    for (int i = 0; i <= strlen(targetString); i++) {
        if (targetString[i] != ' ' && targetString[i] != '\0') {
            currentLength++;
        else {
            if (maxLength <= currentLength) {
                maxLength = currentLength;
                maxIndex = i - currentLength;  //記錄當前最長單詞的起始下標
                tempArray[maxIndex] = maxLength;
            }
            currentLength = 0;//同時給記錄單詞長度的currentlength作清零操做
        }
    }
    for (int i = 0 ; i < 200; i++) {
        if (tempArray[i] == maxLength) {
            for (int j = i; j < i + maxLength; j++) {
                printf("%c", targetString[j]);
            }
            printf("\n");
        }
    }
   
  
    // 經典3
    //耶穌有13個門徒,其中有一個就是出賣耶穌的叛徒,請用排除法找出這位叛徒:13人圍坐一圈,從第一個開始報號:1,2,3,1,2,3...凡是報到'3'就退出圈子,最後留在圈子內的人就是出賣耶穌的叛徒.請找出它原來的序號
    int  array[13]={1,2,3,4,5,6,7,8,9,10,11,12,13};//模擬報數,0表示未退出圈子,1表示退出圈子
    int  numbers=13;//表示剩餘人數
    int  count = 0;//表示報數
    int   i =0;// 表示下標的循環變量
    while (numbers > 1) {
        if (array[i]!=0) {//若是當前獲得的數組元素不爲0,表示沒有退出圈子,則count++表示報數
            count++;
        }
        if (count == 3) {
            printf("%d號退出圈子\n",array[i]);
            array[i] = 0;//表示當前報數的人報的數爲3,則經過數組元素賦值爲0來表示他退出圈子
            count = 0;//報數歸0
            numbers --;//表示退出圈子後剩餘的人數
        }
        i++;
        i = i %13;// 若是i爲13時,讓i從新從0開始
    }
    for int i =0; i < 13; i++) {
        if (array[i] > 0) {
            printf("%d號是叛徒",array[i]);
        }
    }
     
     
    // 經典4
    //將兩個排好序的數組,合併到另外一個數組中,而且合併以後的數組也是有序的
    int i = 0, m = 5, a[5] = {1, 3, 7, 9, 13};
    int j = 0, n = 6, b[6] = {2, 4, 8, 16, 20, 24};
    int k = 0, c[11];
    while(i + j < m + n)
    {
        if(j >= n) {
            c[k++] = a[i++];
        }
        else if(i >= m) {
            c[k++] = b[j++];
        }
        else if(a[i] < b[j]){
            c[k++] = a[i++];
        }
        else {
            c[k++] = b[j++];
        }
    }
    for(i = 0;i < k;i++){
        printf("%d  ",c[i]);
    }
     
     
    // 經典5
    //有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。
    float sum = 0;
    float x = 2, y = 1, temp = 0;
    for (int i = 0; i < 20; i++) {
        sum = sum + x / y;
        temp = x;
        x = x + y;
        y = temp;
    }
    printf("%.3f", sum);
     
    //給一個很少於5位的正整數,要求:1、求它是幾位數,2、逆序打印出各位數字。
    //方法一:
    long a=0,b=0;
    int t=0;
    printf("請輸入很少於5位的正整數:\n");
    scanf("%ld",&a);
    if (a >= 100000) {
        printf("請輸入很少於5位的正整數\n");
    }else {
        for(t=0;a>0;a/=10,t++)
        {
            b=(b*10)+a%10;
        }
        printf("這個數是%d位的,逆序數=%ld\n",t,b);
    }
    //方法二:
    int a = 0, b = 0, c = 0, d = 0, e = 0, x = 0;
    printf("請輸入很少於5位的整數:\n");
    scanf("%d", &x);
    if (x > 100000) {
        printf("請輸入很少於5位的整數");
    }else{
    a = x / 10000;//分解出萬位
    b = x % 10000 / 1000;//分解出千位
    c = x % 1000 / 100;//分解出百位
    d = x % 100 / 10;//分解出十位
    e = x % 10;//分解出個位
    if (a !=0 ) {
        printf("這個數是5位的, 逆序數 = %d%d%d%d%d\n",e, d, c, b, a);
    }else if (b!=0){
         printf("這個數是4位的, 逆序數 = %d%d%d%d\n",e,d,c,b);
    }else if (c!=0){
         printf("這個數是3位的, 逆序數 = %d%d%d\n",e,d,c);
    }else if (d!=0){
         printf("這個數是2位的, 逆序數 = %d%d\n",e,d);
    }else if (e!=0){
         printf("這個數是1位的, 逆序數 = %d\n",e);
    }
    }
    // 方法三
    int num = 0, temp = 0, i = 0;
    printf("請輸入一個數字\n");
    scanf("%d", &num);
    while(num > 0)
    {
        temp = num % 10;
        ++i;
        printf("%d", temp);
        num = num / 10;
    }
    printf("\n這個數是%d位數", i);
 
    // 經典6
    //一個5位數,判斷它是否是迴文數.即12321是迴文數,個位與萬位相同,十位與千位相同.
    long w = 0, q = 0, s = 0, g = 0 , x = 0;
    printf("請輸入一個5位數:\n");
    scanf("%ld", &x);
   if (x > 100000 || x < 10000) {
        printf("請輸入一個5位數:\n");
    }else{
    w = x / 10000;//求萬位的數字
    q = (x % 10000) / 1000; //求千位的數字
    s = x % 100 / 10;//求十位的數字
    g = x % 10;//求個位數字
    if (g == w && q == s) {
        printf("是迴文數");
    }
    else{
        printf("不是迴文數");
    }
    }
     
     //經典7
    //星期一   Monday
    //星期二   Tuesday
    //星期三   Wednesday
    //星期四   Thursday
    //星期五   Friday
    //星期六   Saturday
    //星期日   sunday
    //請輸入星期幾的第一個字母來判斷一下是星期幾,若是第一個字母同樣,則繼續判斷第二個字母
    char week1;
    char week2;
    printf("星期一   Monday \n星期二   Tuesday \n星期三   
Wednesday  \n星期四   Thursday  \n星期五   Friday  \n星期六   Saturday   \n星期日   
sunday\nplease enter a letter\n");
    scanf("%c",&week1);
    switch(week1)
    {
        case('M' 'm'):printf("the answer is Monday\n");
            break;
        case'W':printf("the answer is Wednesday\n");
            break;
        case('F' 'f'):printf("the answer is Friday\n");
            break;
       case('S' 's'):
        {
            printf("please enter the second letter\n");
            scanf("%c",&week2);
            getchar();
            if(week2 == ('a' 'A'))
                printf("the answer is Saturday\n");
            else
                if(week2 == ('u' 'U'))
                    printf("the answer is Sunday\n");
                else
                    printf("there is no answer\n");
        }
            break;
        case('T' 't'):
        {
            printf("please enter the second letter\n");
            scanf("%c",&week2);
            getchar();
            if(week2 == ('U' 'u'))               printf("the answer is Tuesday\n");
            else               if(week2 == ('H' 'h'))
                printf("the answer is Thursday\n");
            else
              printf("there is no answer\n");
        }
            break;
        default:
            printf("there is no correct answer\n");
            break;
    }
     
    // 經典8
    //有1000000個數,每一個數取值範圍是0-999999找出其中重複的數,重複次數
    int a[1000000] = {0}, b[1000000] = {0}, count = 0;
    for(int i = 0 ; i < 1000000 ; i ++){
        a[i] = arc4random()%1000000;
        b[a[i]]++;
    }
    for (int j = 0 ; j < 1000000; j++) {
        if(b[j] > 1){
            count++;
            printf("重複數是%d \n",j);
        }
    } 
編程

相關文章
相關標籤/搜索