回答編集履歴

5 説明の訂正

退会済みユーザー

退会済みユーザー

2018/05/08 11:05  投稿

入力回数がわかっているのなら配列を使うこともできます。
(i)入力回数をnとしサイズ2 * nの配列を準備します。(名前をdataにしておきます。)
(ii)0行目には入力されたデータを格納し、1行目にはその**2乗の値**を格納します。
2乗した値を格納した理由は(iv)に書きました。
(ii)0行目には入力されたデータを格納し、1行目にはその**絶対値**を格納します。
(例)入力回数 n = 3
入力された整数 3 1 -5の時 [][]dataは 
```
3 1 -5
9 1 25
3 1 5
```
となっています。
(iii)2乗した値の中で最小値をとります。(今回は1です。)
(iii)絶対値の中で最小値をとります。(今回は1です。)
(iv)2乗した値の中の最小値は2乗する前の「最も0に近い整数」となっているので
2乗した値の中の最小値の配列の番号を使って求めたいものを表示します。
(iv)絶対値の中の最小値の配列の番号を使って求めたいものを表示します。
今回は最小値が1でしたがそれはdata[1][1]です。
ということは、求めたい「最も0に近い整数」は**data[0][1]**と なっているはずです。
私が、書いたソースコードを載せておきます。
```Java
import java.util.*;
public class Main {
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int [][]data = new int[2][n];
       int min = 100;
       int min;
       int []min2 = {0,0};
       int []count = {0,0};
       for(int i = 0; i < n; i++){
           data[0][i] = sc.nextInt();
           data[1][i] = data[0][i] * data[0][i];
           data[1][i] = Math.abs(data[0][i]);
           min = data[1][0];
           if(min >= data[1][i]){
               min = data[0][i];
               if(min >= 0){
                   min2[0] = min;
               if(data[1][i] >= 0){
                   min2[0] = data[0][i];
                   count[0]++;
               }
               else{
                   min2[1] = min;
                   min2[1] = data[0][i];
                   count[1]++;
               }
               min *= min;  
           }
       }
       int flag = 0;
       for(int i = 0; i < 2; i++){ //0に最も近い整数が1つの時(正、負のどちらか片方だけある)
     
      int flag = 0;
       for(int i = 0; i < 2; i++){//0に最も近い整数が1つの時(正、負のどちらか片方だけある)
          if(count[i] == 0){
               flag = 1;
               System.out.println(min2[1 - i]);
           }
       }
       if(flag == 0){ //0に最も近い整数が2つの時(正、負両方あり)
       if(flag == 0){//0に最も近い整数が2つの時(正、負両方あり)
           System.out.println(min2[0]);
       }
 
   }
}
```
<入力例>
7
-1
4
-2
3
6
5
1
<出力例>
1
4 説明の追加

退会済みユーザー

退会済みユーザー

2018/05/07 22:44  投稿

入力回数がわかっているのなら配列を使うこともできます。
(i)入力回数をnとしサイズ2 * nの配列を準備します。(名前をdataにしておきます。)
(ii)0行目には入力されたデータを格納し、1行目にはその**2乗の値**を格納します。
2乗した値を格納した理由は(iv)に書きました。
(例)入力回数 n = 3
入力された整数 3 1 -5の時 [][]dataは 
```
3 1 -5
9 1 25
```
となっています。
(iii)2乗した値の中で最小値をとります。(今回は1です。)
(iv)2乗した値の中の最小値は2乗する前の「最も0に近い整数」となっているので
2乗した値の中の最小値の配列の番号を使って求めたいものを表示します。
今回は最小値が1でしたがそれはdata[1][1]です。
ということは、求めたい「最も0に近い整数」は**data[0][1]**と なっているはずです。
私が、書いたソースコードを載せておきます。
```Java
import java.util.*;
public class Main {
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int [][]data = new int[2][n];
       int min = 100;
       int []min2 = {0,0};
       int []count = {0,0};
       for(int i = 0; i < n; i++){
           data[0][i] = sc.nextInt();
           data[1][i] = data[0][i] * data[0][i];
           if(min > data[1][i]){
               if(data[1][i] >= 0){
                   min2[0] = data[0][i];
           if(min >= data[1][i]){
               min = data[0][i];
               if(min >= 0){
                   min2[0] = min;
                   count[0]++;
               }
               else {
                   min2[1] = data[0][i];
               else{
                   min2[1] = min;
                   count[1]++;
               }
               min *= min;  
           }
       }
       
       for(int i = 0; i < 2; i++){
           if(count[i] == 0){
       int flag = 0;
       for(int i = 0; i < 2; i++){ //0に最も近い整数が1つの時(正、負のどちらか片方だけある)
          if(count[i] == 0){
               flag = 1;
               System.out.println(min2[1 - i]);
           }
       }  
       if(flag == 0){ //0に最も近い整数が2つの時(正、負両方あり)  
           System.out.println(min2[0]);  
       }
   }
}
```
<入力例>
7
-1
4
-2
3
6
5
1
<出力例>
1
3 ソースの訂正

退会済みユーザー

退会済みユーザー

2018/05/07 22:29  投稿

入力回数がわかっているのなら配列を使うこともできます。
(i)入力回数をnとしサイズ2 * nの配列を準備します。(名前をdataにしておきます。)
(ii)0行目には入力されたデータを格納し、1行目にはその**2乗の値**を格納します。
2乗した値を格納した理由は(iv)に書きました。
(例)入力回数 n = 3
入力された整数 3 1 -5の時 [][]dataは 
```
3 1 -5
9 1 25
```
となっています。
(iii)2乗した値の中で最小値をとります。(今回は1です。)
(iv)2乗した値の中の最小値は2乗する前の「最も0に近い整数」となっているので
2乗した値の中の最小値の配列の番号を使って求めたいものを表示します。
今回は最小値が1でしたがそれはdata[1][1]です。
ということは、求めたい「最も0に近い整数」は**data[0][1]**と なっているはずです。
私が、書いたソースコードを載せておきます。
```Java
import java.util.*;
public class Main {
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int [][]data = new int[2][n];
       int min = 10000;
       int count = 0;
       int min = 100;
       int []min2 = {0,0};
       int []count = {0,0};
       for(int i = 0; i < n; i++){
           data[0][i] = sc.nextInt();
           data[1][i] = data[0][i] * data[0][i];
           if(min > data[1][i]){
               min = data[1][i];
               if(data[1][i] >= 0){
                   min2[0] = data[0][i];
                   count[0]++;
               }
               else {
                   min2[1] = data[0][i];
                   count[1]++;
               }
           }
       }
       for(int i = 0; i < n; i++){
           if(data[1][i] == min){
               count++;
           }
       }
       for(int i = 0; i < n; i++){
           if(data[1][i] == min){
               if(count == 1){
                   System.out.println(data[0][i]);
               }
               else{
                   if(data[0][i] > 0){
                       System.out.println(data[0][i]);
                   }
               }
       
       for(int i = 0; i < 2; i++){
           if(count[i] == 0){
               System.out.println(min2[1 - i]);
           }
       }
   }
}
```
<入力例>
7
-1
4
-2
3
6
5
1
<出力例>
1
2 説明の訂正

退会済みユーザー

退会済みユーザー

2018/05/07 22:17  投稿

入力回数がわかっているのなら配列を使うこともできます。
(i)入力回数をnとしサイズ2 * nの配列を準備します。(名前をdataにしておきます。)
(ii)0行目には入力されたデータを格納し、1行目にはその**2乗の値**を格納します。
2乗した値を格納した理由は(iv)に書きました。
(例)入力回数 n = 3
入力された整数 3 1 -5の時 [][]dataは 
```
3 1 -5
9 1 25
```
となっています。
(iii)2乗した値の中で最小値をとります。(今回は1です。)
(iv)2乗した値の中の最小値は2乗する前の「最も0に近い整数」となっているので
2乗した値の中の最小値の配列の番号を使って求めたいものを表示します。
今回は最小値が1でしたがそれはdata[1][1]です。
ということは、求めたい「最も0に近い整数」は**data[0][1]**と なっているはずです。
私が、書いたソースコードを載せておきます。
```Java
import java.util.*;
public class Main {
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int [][]data = new int[2][n];
       int min = 10000;
       int count = 0;
       for(int i = 0; i < n; i++){
           data[0][i] = sc.nextInt();
           data[1][i] = data[0][i] * data[0][i];
           if(min > data[1][i]){
               min = data[1][i];
           }
       }
       for(int i = 0; i < n; i++){
           if(data[1][i] == min){
               count++;
           }
       }
       for(int i = 0; i < n; i++){
           if(data[1][i] == min){
               if(count == 1){
                   System.out.println(data[0][i]);
               }
               else{
                   if(data[0][i] > 0){
                       System.out.println(data[0][i]);
                   }
               }
           }
       }
   }
}
```
<入力例>
7
-1
4
-2
3
6
5
1
<出力例>
-1
1
1 説明の訂正

退会済みユーザー

退会済みユーザー

2018/05/07 22:17  投稿

入力回数がわかっているのなら配列を使うこともできます。
(i)入力回数をnとしサイズ2 * nの配列を準備します。(名前をdataにしておきます。)
(ii)0行目には入力されたデータを格納し、1行目にはその**2乗の値**を格納します。
2乗した値を格納した理由は(iv)に書きました。
(例)入力回数 n = 3
入力された整数 3 1 -5の時 [][]dataは 
```
3 1 -5
9 1 25
```
となっています。
(iii)2乗した値の中で最小値をとります。(今回は1です。)
(iv)2乗した値の中の最小値は2乗する前の「最も0に近い整数」となっているので
2乗した値の中の最小値の配列の番号を使って求めたいものを表示します。
今回は最小値が1でしたがそれはdata[1][1]です。
ということは、求めたい「最も0に近い整数」は**data[0][1]**と なっているはずです。
尚、最小値が複数ある場合はそれらをすべて列挙すればよいでしょう。  
私が、書いたソースコードを載せておきます。
```Java
import java.util.*;
public class Main {
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int [][]data = new int[2][n];
       int min = 10000;
       int count = 0;  
       for(int i = 0; i < n; i++){
           data[0][i] = sc.nextInt();
           data[1][i] = data[0][i] * data[0][i];
           if(min > data[1][i]){
               min = data[1][i];
           }
       }
       for(int i = 0; i < n; i++){
           if(data[1][i] == min){
               System.out.print(data[0][i] + " ");
               count++;
           }
       }
       for(int i = 0; i < n; i++){
           if(data[1][i] == min){
               if(count == 1){
                   System.out.println(data[0][i]);
               }
               else{
                   if(data[0][i] > 0){
                       System.out.println(data[0][i]);
                   }
               }
           }
       }
   }
}
```
<入力例>
7
-1
4
-2
3
6
5
1
<出力例>
-1 1
-1

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る