C語言每日一練(三)

2020-10-22 01:00:59

       C語言作為嵌入式Linux開發的必備工具,作為嵌入式Linux開發的基礎語言,那麼在面試嵌入式工程師時C語言定是面試中的重中之重 。作為一名大三的老學長,不得不為找工作做必要準備。每天做一道C語言面試題,為面試打基礎。
Alt

2020.09.04

題目描述
       輸入一個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。

輸入描述:
       輸入一個整數(int型別)

輸出描述:
        這個數轉換成2進位制後,輸出1的個數

範例1
輸入
5
輸出
2

題目解析:
       一般的思路可能是先將這個整數轉換為二進位制數,將轉換後的每一位存放在陣列中,然後通過這個陣列統計1的個數。其實這是下下策,耗費記憶體同時遍歷陣列也消耗時間。那麼我們可以換一種思路,通過位運算來實現統計1的個數,可以大大提高效率。

#include <stdio.h>
int func(x)
{
	int countx = 0;
	while(x)
	{
		countx ++;
		x = x&(x-1);
	}
	return countx;
}
int main()
{
    int data;
    scanf("%d",&data);
    printf("%d", func(data));
}

2020.09.05

題目描述:
       輸入一個整數,將這個整數以字串的形式逆序輸出
       程式不考慮負數的情況,若數位含有0,則逆序形式也含有0,如輸入為100,則輸出為001

輸入描述:
       輸入一個int整數

輸出描述:
       將這個整數以字串的形式逆序輸出

範例1:
輸入
1516000
輸出
0006151

題目解析:
       一開始拿到題目的思路是通過sprintf函數將整數轉換成字串並存放在陣列str1中,然後通過迴圈來實現交換。但是實際測試時發現只能通過50%,具體什麼原因我也不知道。

#include<stdio.h>
#include<string.h>
int main()
{
    int n,i,size;
    char str1[100],temp;
    scanf("%d",&n);
    sprintf(str1,"%d",n);
    size=strlen(str1);
    for(i=0;i<=(size/2);i++){
        temp=str1[i];
        str1[i]=str1[size-i-1];
        str1[size-i-1]=temp;
    }
    printf("%s\n",str1);
}

去問了一下群友,才發現太馬虎大意了,這個程式對於只有奇數個字元時並沒有影響,但是對於偶數個字元時就會出錯,原因就是在迴圈結束的判斷條件應該是小於而不是小於等於
       不過換一種思路就很簡單,通過對整個整數求餘數得出最低位然後輸出不妨為一個很好的方法,10行程式碼就能夠搞定。

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    for(;n>0;){
        printf("%d",n%10);
        n=n/10;
    }
}

2020.09.06

題目描述:
       將一個字串str的內容顛倒過來,並輸出。str的長度不超過100個字元。 如:輸入「I am a student」,輸出「tneduts a ma I」。
輸入引數:

       inputString:輸入的字串
返回值:

       輸出轉換好的逆序字串

輸入描述:
       輸入一個字串,可以有空格

輸出描述:
       輸出逆序的字串

範例1
輸入
複製
I am a student
輸出
複製
tneduts a ma I

題目解析:

#include<stdio.h>
#include<string.h>
int main()
{
    int i,size;
    char str1[100],temp;
    gets(str1);
    size=strlen(str1);
    for(i=0;i<(size/2);i++){
        temp=str1[i];
        str1[i]=str1[size-i-1];
        str1[size-i-1]=temp;
    }
    printf("%s\n",str1);
}

2020.09.07

題目描述
       公元前五世紀,我國古代數學家張丘建在《算經》一書中提出了「百雞問題」:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?
輸入描述:
       輸入任何一個整數,即可執行程式。

範例1
輸入
1
輸出
0 25 75
4 18 78
8 11 81
12 4 84

題目解析:

#include<stdio.h>
#include<string.h>
int main()
{
    int a,b,n;
    while(scanf("%d",&n)!=EOF)
    {
        for(a=0;a<20;a++)
        {
            for(b=0;b<34;b++)
            {
                if(((a*5+b*3+(100-a-b)/3)==100)&&(100-a-b)%3==0)
                    printf("%d %d %d\n",a,b,100-a-b);
            }
        }
    }
}

2020.09.08

題目描述:
       功能:等差數列 2,5,8,11,14。。。。
輸入描述:
       輸入一個正整數。
輸出描述:
       輸出一個相加後的整數。

範例1
輸入
2
輸出
7

題目解析:

#include<stdio.h>
int main()
{
    int a0,q,n,sum;
    a0=2;
    q=3;
    while(scanf("%d",&n)!=EOF)
    {
        sum=n*a0+(n*(n-1)*q/2);
        printf("%d\n",sum);
    }
}

2020.09.09

題目描述:

       寫出一個程式,接受一個字串,然後輸出該字串反轉後的字串。(字串長度不超過1000)

輸入描述:

       輸入N個字元

輸出描述:

       輸出該字串反轉後的字串

範例:
       輸入:abcd
       輸出:dcba

題目解析:
       看到題目後,這應該是一個C語言中比較基礎的題目了。常規的方法就是將一個字串給分成兩半,對稱位置進行交換,然後再正序輸出。題目只是讓逆序輸出字串,並沒有規定方法那麼我們在輸出時直接通過for迴圈逆序輸出不就可以了嘛!那麼程式碼就可以簡化為下面的了嘛!

#include<stdio.h>
#include<string.h>
int main()
{
    char str[1000];
    scanf("%s",str);
    int len=strlen(str);
    for(int i=len-1;i>=0;i--)
    {
        printf("%c",str[i]);
    }
    return 0;
}

2020.09.10

題目描述:
       正整數A和正整數B 的最小公倍數是指 能被A和B整除的最小的正整數值,設計一個演演算法,求輸入A和B的最小公倍數。

輸入描述:
       輸入兩個正整數A和B。

輸出描述:
       輸出A和B的最小公倍數。

題目解析:
       本題目是求最小公倍數,而最小公倍數等於兩個數相乘除以兩個數的最大公約數。實際上就轉換為了求最大公約數的問題了,我們可以通過輾轉相除法來求最大公約數。

#include "stdio.h"
t gcd(int a, int b)//輾轉相除法求最大公約數
{
    while(a%b){
        int tmp=a;
        a=b;
        b=tmp%b;
    }
    return b;
 
}

int main()
{
    int a, b;
    
    scanf("%d %d",&a,&b);
    printf("%d",a*b/gcd(a,b));
    
    return 0;
}

       不積小流無以成江河,不積跬步無以至千里。而我想要成為萬里羊,就必須堅持學習來獲取更多知識,用知識來改變命運,用部落格見證成長,用行動證明我在努力。
       如果我的部落格對你有幫助、如果你喜歡我的部落格內容,記得「點贊」 「評論」 「收藏」一鍵三連哦!聽說點讚的人運氣不會太差,每一天都會元氣滿滿呦!如果實在要白嫖的話,那祝你開心每一天,歡迎常來我部落格看看。
在這裡插入圖片描述