(Niuke.com)Huaweiマシンテストの質問セットの回答
最初の質問HJ108は、最小公倍数を見つけます。
直接公約数ソリューション
#include<iostream>
using namespace std;
int gcd(int a,int b) //求最大公约数函数
{
int r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
int main()
{
int a,b,g;
while(scanf("%d%d",&a,&b)!=EOF)
{
if(a>b)
g=gcd(a,b);
else
g=gcd(b,a);
g=(a*b)/g;
printf("%d\n",g);
}
return 0;
}
2番目の質問HJ107は、立方根を見つけます。
アイデア:
二分探索を使用して、最初に入力番号numと0を構成して間隔を形成し、次に(num + 0)/ 2の3乗を使用してnumと比較します。コンピューターの2つの数値は、2を意味しないことに注意してください。の各桁は同じですが、2つの数値の差が1e-7(通常)の場合は同じと見なされ、等しくない場合はサイズを比較し、数値未満の場合はを使用します。右側の間隔で、中央値を使用して操作を繰り返します。numより大きい場合は、条件に一致する数値が見つかるまで左側の間隔で同じことを行い、それを小数として出力します。
import java.util.Scanner;
public class Main{
public static void main(String args[]){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext())
{
double input = scanner.nextDouble();
double result = getCubeRoot(input);
System.out.printf("%.1f\n", result);
}
scanner.close();
}
private static double getCubeRoot(double input){
double min = 0;
double max = input;
double mid = 0;
// 注意,这里的精度要提高一点,否则某些测试用例无法通过
while ((max - min) > 1e-7)
{
mid = (max + min) / 2;
if (mid * mid * mid > input)
max = mid;
else if (mid * mid * mid < input)
min = mid;
else
return mid;
}
return max;
}
}
3番目の質問HJ106文字の逆順:
アイデア:キューまたはスタックを直接配置することも、文字列を配列に格納してからラベルを押して最大から最小に出力することもできます。スペースを入力するときは、スペースも文字であることに注意してください。 、およびキャリッジリターンが発生した場合にのみ終了します。
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner scanner=new Scanner(System.in);
while(scanner.hasNext()){
String str=scanner.nextLine();
StringBuilder sb = new StringBuilder(str);
System.out.println(sb.reverse().toString());
}
}
}
4番目の質問HJ105
アイデア:
すべての入力数値を配列に入れてから、配列をトラバースします。トラバース中に、2つのカウンターを使用して配列内の負の数と正の数の数を記録し、正の数を記録するアキュムレーターがあります。この質問は、出力形式の平均値が10進型であるということです。
import java.util.*;
import java.io.*;
public class Main{
public static void main(String args[]) throws Exception{
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(System.in));
String[] nums = bufferedreader.readLine().split(" ");
int Num1 = 0; //记录负数的个数
int Num2 = 0; //记录非负数的个数
int sum = 0;
for(int i=0;i<nums.length;i++){
int num = Integer.parseInt(nums[i]);
if(num<0){
Num1++;
}
else{
sum+=num;
Num2++;
}
}
System.out.println(Num1);
System.out.println(Math.round(sum*10.0/Num2)/10.0);
}
}