華爲機試真題2017

1.汽水瓶問題
題目描述:

有這樣一道智力題:“某商店規定:三個空氣水瓶可以換一瓶汽水。小張手上有是個空汽水瓶,他最多可以換多少平汽水喝?”答案是5瓶,方法如下:先用9個空汽水瓶換3瓶汽水,喝掉3瓶滿的,喝完以後4個空瓶子,用3個再換一瓶,喝掉這瓶滿的,這時候剩2個空瓶子。然後你讓老闆先借你一瓶汽水,喝掉這瓶滿的,喝完後用3個空瓶子飯一瓶滿的還給老闆。如果小張手上有n個空汽水瓶,最多可以換多少瓶汽水喝?

思路是:

1.初始currentKongPing=n個瓶子,已喝飲料數countYingLiao=0;

2.第一次換飲料時:換得飲料數intPre=currentKongPing%3   剩餘空瓶intPro=n/3 

3.喝完後空瓶數量更新爲“換得飲料數”+“剩餘空瓶”,

即currentKongPing=intPre+intPro

當前已喝飲料=上一步已喝飲料+換得飲料

即countYingLiao=countYingLiao+intPre

4.繼續第二次換飲料,轉至第二步

#include <stdio.h>
int coutPingZi(int n)
{
	int currentKongPing;
	int countYingLiao;
	int interPre;
	int interPro;
	currentKongPing = n;//初始時空瓶子數量等於n
	countYingLiao = 0;
	while (currentKongPing)
	{
		if (currentKongPing<2)
		{
			countYingLiao += 0;
			break;
		}
		else//可以換到飲料
		{
			if (currentKongPing == 2)
			{
				countYingLiao++;
				break;
			}
			else//大於2時
			{
				interPre = currentKongPing /3;//當前飲料數目
				interPro = currentKongPing %3;//當前空瓶子
				countYingLiao += interPre;
				currentKongPing = interPre + interPro;
			}
		}
	}
	return countYingLiao;
}

int main (){
 
    int n;
 	int yinLiao;
     while(scanf("%d",&n)!=EOF&&n!=0)
/*在牛客網上要通過全部的測試用例,一定要遵守規則,這裏scanf()!=EOF是保證了循環輸入,EOF是文件輸入截至標記,如果文件輸入爲截至則一直輸入n!=0是輸入截至判斷條件*/
    {
        yinLiao = coutPingZi(n);
        printf("%d\n",yinLiao);
    }
    return 0;
 
}

測試通過

最好不要用投機取巧的方法,解決問題的思路很重要

2.明明的隨機數

明明想在學校中請一些同學一起做一項問卷調查,爲了實驗的客觀性,他先用計算機生成了N個1到1000之間的隨機整數(N≤1000),對於其中重複的數字,只保留一個,把其餘相同的數去掉,不同的數對應着不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成“去重”與“排序”的工作(同一個測試用例裏可能會有多組數據,希望大家能正確處理)。

 

注意:題目要求測試用例要循環輸入,輸入一個數組長度,循環輸入數組元素;再輸入一個數組長度,循環輸入數組元素......

思路:一種直接的思路是將數組排序,然後按照數組值比較輸出後一個和前一個不同的數據。

第二種思路也是本文的思路是:在輸入數據的同時用“計數排序的思想”將出現的數據存放到一個定長的數組arr[]中,arr的最大下標取決於輸入數據的最大值,這裏最大值爲1000,因此arr的長度爲1001,下標取值爲0-1000。這樣在輸入數據的同時可將出現的元素在arr數組中用下標的方式標記出來,輸出某元素n時只用判斷該元素在arr[n]中是否>1。

#include <stdio.h>
int main()
{
    int n,num,i,j;
    while(scanf("%d",&n)!=EOF)//輸入數組長度  注意scanf在輸入時一定要加!=EOF,否則通過不了
    {
        int arr[1001]={0};//定義數據存放統計個數
        for(j=0;j<n;j++)
        {
            scanf("%d",&num);//讀入的同時進行計數,超過1個的也置爲1
            arr[num]=1;//讀入數據的時候在長度爲10001的數組中將對應下標標記完成
        }
        for(i=0;i<1001;i++)
        {
            if(arr[i])//從1-1000開始查詢,如果出現過則arr[i]=1,否則爲0不輸出
                printf("%d\n",i);//這樣在遍歷時即可完成排序的任務
        }
    }
    return 0;//注意main函數返回值爲0,不加會出錯
}

3.進制轉換

寫出一個程序,接受一個十六進制的數,輸出該數值的十進制表示。(多組同時輸入 )

 

思路:十六進制轉十進制,考慮兩個方面,

一是十進制=十六進制中的元素*對應權位

二是字符轉數字時,用到的ASCII碼轉換

見代碼描述部分

#include <stdio.h>
#include <math.h>
int main()
{
	char a[100];
	int len;
	int i;
	
	while (scanf("%s",a)!=EOF)
	{
                int sum=0;
		len = strlen(a);
        //printf("%d",len);
		for (i = 0; i < len; i++)//a[0]到a[len-1]
		{
			//十六進制 0-9  10-15用A-F
			//從左至右分別爲高位到低位,第一位 a[0]*16^(len-1)   最後一位 a[0]*16^(0)
			if ('0' <= a[i]&&a[i]<= '9')
			{
				sum += (a[i] - 48) * pow(16, (len - 1 - i));//0的ASCII碼爲48
			}
			else if ('A' <= a[i]&&a[i] <= 'F')//A的ASCII碼爲65
			{
				sum += (a[i] - 55)*pow(16, (len - 1 - i));
			}
		}
        printf("%d\n",sum);//注意:輸出時要換行,否則會出錯
	}
	

	return 0;
}

總結一下可能的出錯地方:

如果代碼的邏輯部分寫的正確,

1.檢查輸入是否用了“while循環”

2.是否進行了輸入到文件末尾判斷“scanf()!=EOF”

3.是否進行了換行處理printf("\n");

4.C語言執行結束後是否return 0;

4.編程題]最高分是多少

老師想知道從某某同學當中,分數最高的是多少,現在請你編程模擬老師的詢問。當然,老師有時候需要更新某位同學的成績.

輸入描述:

輸入包括多組測試數據。
每組輸入第一行是兩個正整數N和M(0 < N <= 30000,0 < M < 5000),分別代表學生的數目和操作的數目。
學生ID編號從1編到N。
第二行包含N個整數,代表這N個學生的初始成績,其中第i個數代表ID爲i的學生的成績
接下來又M行,每一行有一個字符C(只取‘Q’或‘U’),和兩個正整數A,B,當C爲'Q'的時候, 表示這是一條詢問操作,他詢問ID從A到B(包括A,B)的學生當中,成績最高的是多少
當C爲‘U’的時候,表示這是一條更新操作,要求把ID爲A的學生的成績更改爲B。
輸出描述:
對於每一次詢問操作,在一行裏面輸出最高成績.

#include<stdio.h>
#include<string.h>
int main()
{
	int n, m;
	int a[30000] = { 0 };
	int num1, num2;
	int max, min;
	char s[2];
	
	while (scanf("%d %d", &n, &m) != EOF)
	{
		for (int i = 1; i <= n; i++)
		{
			scanf("%d", &a[i]);
		}
		for (int j = 0; j<m; j++)
		{
			scanf("%s %d %d", s, &num1, &num2);
			max = num2;
			min = num1;
			if (strcmp(s, "Q") == 0)
			{
				if (num1 > num2)
				{
					max = num1;
					min = num2;
				}
				int temp = 0;
				for (int k = min; k <= max; k++)
				{
					
					if (temp <= a[k])
					{
						temp = a[k];
					}
				}
				printf("%d\n", temp);
			}
			else if (strcmp(s, "U") == 0) {
				a[num1] = num2;
			}
		}
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章