牛客 華為機試(1)

2021-10-06 18:56:49 字數 4350 閱讀 1652

題目一

正整數a和正整數b 的最小公倍數是指 能被a和b整除的最小的正整數值,設計乙個演算法,求輸入a和b的最小公倍數。

方法一:讓a與b中較大的數乘以1,2,…,如果可以整除較小的數,則輸出。

#include

using

namespace std;

intmain()

for(

int i =

1; i <= b; i++)}

return0;

}

方法二;最小公倍數等於兩個數的乘積除以這兩個數的最大公約數。使用輾轉相除法求最大公約數。

#include

using

namespace std;

intcommondivisor

(int a,

int b)

while

(a % b !=0)

return b;

}int

main()

題目二

計算乙個double型數字的立方根,不使用庫函式。

方法一:使用二分法

方法二:牛頓迭代法,假設輸入的數為a,即求x^ 3-a=0的根。令f(x)=x^ 3-a,迭代公式為xn+

1=xn

−f(x

n)/f

′(xn

)x_=x_n-f(x_n)/f'(x_n)

xn+1​=

xn​−

f(xn

​)/f

′(xn

​).

#include

using

namespace std;

bool

equal

(double a,

double b)

double

unsignedgetcuberoot

(double input)

return mid;

}double

unsignedgetcuberoot2

(double input)

return result;

}int

main()

else

cout <<

unsignedgetcuberoot

(input)

<< endl;

}

題目三

將乙個字串str的內容顛倒過來,並輸出。str的長度不超過100個字元。 如:輸入「i am a student」,輸出「tneduts a ma i」。

#include

#include

using

namespace std;

intmain()

return0;

}

題目四

從輸入任意個整型數,統計其中的負數個數並求所有非負數的平均值,結果保留一位小數

#include

using

namespace std;

intmain()

}printf

("%d"

,k);

printf

("\n");

if(i ==0)

else

return0;

}

題目五

連續輸入字串(輸出次數為n,字串長度小於100),請按長度為8拆分每個字串後輸出到新的字串陣列,長度不是8整數倍的字串請在後面補數字0,空字串不處理。

#include

#include

using

namespace std;

intmain()

}}}

題目六

redraiment是走梅花樁的高手。redraiment總是起點不限,從前到後,往高的樁子走,但走的步數最多,不知道為什麼?你能替redraiment研究他最多走的步數嗎?

解析:這是最長上公升子串行問題,使用動態規劃求解。定義乙個result陣列,result[i]為從頭走到第i個樁的最大步數,如果第i個樁的值小於前面所有樁的值,則這個樁的步數應該為1,否則,第i個樁肯定從第0個到第i-1個樁中的某個樁走來的,所以就在0~i-1的可行樁中選步數最大的,也就是result[i]=max(result[i],result[j]+1) ,其中j為低於i的樁。

#include

#include

#include

using

namespace std;

intmain()

res =

max(res,result[i]);

} cout << res << endl;

}return0;

}

題目七

功能:等差數列 2,5,8,11,14。。。。

輸入:正整數n >0

輸出:求等差數列前n項和

返回:轉換成功返回 0 ,非法輸入與異常返回-1

#include

using

namespace std;

intmain()

else

}return0;

}

題目八

自守數是指乙個數的平方的尾數等於該數自身的自然數。例如:25^ 2 = 625,76^ 2 = 5776,9376^2 = 87909376。請求出n以內的自守數的個數。

我的做法:定義乙個函式,通過取餘判斷乙個數是不是為另乙個數的尾數。然後可能是自守數的是0,或者以1,5,6結尾的數,所以對這些數進行判斷。

#include

using

namespace std;

bool

endequal

(int a,

int b)

}return

true;}

intmain()

for(

int i =

5; i < n; i = i +10)

for(

int i =

6; i < n; i = i +10)

} cout << result << endl;

}}

別人的做法:將數字轉化為字串來判斷是否為自守數。

#include

#include

using

namespace std;

bool

isautomorphicnumbers

(int a)

題目九

將乙個字元中所有出現的數字前後加上符號「*」,其他字元保持不變。

思路:遍歷所有字元,如果乙個字元是數字,且前面字元不是數字,則在該字元前面加星號;若該字元是數字,且後面字元不是數字,則在該字元後面新增星號。

#include

#include

using

namespace std;

intmain()

if(str[i]

>=

'0'&& str[i]

<=

'9'&&

(i == str.

size()

-1|| str[i+1]

<

'0'|| str[i+1]

>

'9'))}

cout << str << endl;

}}

題目十

現在ipv4下用乙個32位無符號整數來表示,一般用點分方式來顯示,點將ip位址分成4個部分,每個部分為8位(0~255之間),表示成乙個無符號整數(因此不需要用正號出現),如10.137.17.1,是我們非常熟悉的ip位址,乙個ip位址串中沒有空格出現(因為要表示成乙個32數字)。

現在需要你用程式來判斷ip是否合法。

#include

using

namespace std;

intmain()

return0;

}

#include

#include

#include

using

namespace std;

intmain()

cout << result << endl;

}return0;

}

牛客華為機試HJ1

原題傳送門 1 思路分析 思路1 用空格去切,取切完的最後乙個字串長度即可。思路2 從後往前遍歷,直到遇到空格退出迴圈,設找到的第1個空白字元下標為start,s.length 1 start即為所求。示例 遍歷可得start 5,s.length 1 start 14 1 5 8。2 實現 j a...

牛客網 華為機試 009

輸入乙個int型整數,按照從右向左的閱讀順序,返回乙個不含重複數字的新的整數。輸入描述 輸入乙個int型整數 輸出描述 按照從右向左的閱讀順序,返回乙個不含重複數字的新的整數 示例1 9876673 37689 思路 維護乙個陣列或者vector長度為10,下標0 9代表取得數字,值代表是否已經輸出...

牛客網 華為機試 015

輸入乙個int型的正整數,計算出該int型資料在記憶體中儲存時1的個數。輸入乙個整數 int型別 這個數轉換成2進製後,輸出1的個數 示例1 5 2 思路一 利用十進位制轉二進位制的方法,統計1的個數。事實證明這種方法是大錯特錯了,因為效率不高且沒有考慮負數的情況,負數補碼,完全不能這麼計算 inc...