Зробіть від’ємне число додатним


146

У мене є метод Java, в якому я підсумовую набір чисел. Однак я хочу, щоб будь-які цифри негативу трактувалися як позитивні. Отже (1) + (2) + (1) + (- 1) має дорівнювати 5.

Я впевнений, що це дуже легко зробити - я просто не знаю як.


Проста арифметика stackoverflow.com/a/5220597/185022 :)
AZ_

5
Вражає мене, як такі основні питання отримують стільки відгуків ...
Жозе Руй Сантос,

Мої запитання є більш розумними, ніж це, але все ж у ньому є так багато відгуків
ніхто не

Відповіді:



103

Концепція, яку ви описуєте, називається "абсолютне значення", а Java має функцію Math.abs, щоб зробити це за вас. Або ви могли уникнути виклику функції та зробити це самостійно:

number = (number < 0 ? -number : number);

або

if (number < 0)
    number = -number;

21
О, час дилеми - є стільки однаково гарних відповідей, що я міг би також видалити свою. Але тоді я втратив би 40 балів, і ніколи не спіймаю Джона Скіта, якщо це зроблю.
Пол Томблін

3
Вибачте -1 за винахід стандартного дзвінка з бібліотеки.
клент

12
@cletus, ти помітив, що я вже згадував стандартний дзвінок у бібліотеку? Або що в цьому випадку "винахідник" приймає менше вказівок, що викликає бібліотеку?
Пол Томблін

Також варто розібратися в подробицях дзвінка з бібліотеки. Особливо, якщо у виклику бібліотеки є побічні ефекти або такі проблеми, як згадує Пол.
simon

Також +1 через @cletus -1. Ви створюєте кращих програмістів, показуючи як найкраще стандартне рішення проблеми, так і те, що це рішення насправді робить (або щось, що можна порівняти з ним).
Франциско Зарабобозо


12

Використовуйте absфункцію:

int sum=0;
for(Integer i : container)
  sum+=Math.abs(i);

8

Цей код не безпечно називати позитивними цифрами.

int x = -20
int y = x + (2*(-1*x));
// Therefore y = -20 + (40) = 20

3
Ми можемо помножити на -1, а не робити це. Я щось пропускаю?
Сіва Кранті Кумар

7

Спробуйте це (мінус перед x є дійсним, оскільки він є одинарним оператором, більше знайдіть тут ):

int answer = -x;

За допомогою цього ви можете перетворити позитив на негатив і негатив на позитив.


Однак якщо ви хочете зробити лише від’ємне число додатним, спробуйте це:

int answer = Math.abs(x);

АБО , якщо ви хочете чомусь не використовувати метод abs (), спробуйте це:

int answer = Math.sqrt(Math.pow(x, 2));

Сподіваюся, це допомагає! Щасти!


6

Ви питаєте про абсолютні значення?

Math.abs (...) - це функція, яку ви, мабуть, хочете.


6

Ви хочете обгорнути кожне число Math.abs(). напр

System.out.println(Math.abs(-1));

роздруковує "1".

Якщо ви хочете уникати написання Math.частини, ви можете статично включити утиліту Math. Просто напишіть

import static java.lang.Math.abs;

разом з вашим імпортом, і ви можете посилатися на функцію abs()лише написавши

System.out.println(abs(-1));

5

Найпростіший, якщо багатослівний спосіб зробити це - загортати кожен номер у виклик Math.abs (), тож ви додасте:

Math.abs(1) + Math.abs(2) + Math.abs(1) + Math.abs(-1)

з логічними змінами для відображення структури вашого коду. Багатослівний, можливо, але це робить те, що ти хочеш.


3
Ви можете зробити його менш докладним зі статичним імпортом.
Дан Дайер

1
Якщо він має прямий контроль над значеннями, чи не було б краще просто зняти -знак (и)? Або в іншому випадку, у тому числі, якщо він не має контролю, чи не було б краще використовувати таку функцію, як absoluteSum( int[] values ){ /*loop with Math.abs()*/ }замість ручного загортання Math.abs () у кожне значення? [-1]
XenoRo

Я згоден. Інкапсуляція логіки у добре названій функції зробить це більш зрозумілим.
Едді

5

Коли вам потрібно представити значення без поняття втрати чи відсутності (від'ємне значення), це називається "абсолютне значення".


Логіка , щоб отримати абсолютне значення дуже просто: "If it's positive, maintain it. If it's negative, negate it".


Це означає, що ваша логіка та код повинні працювати наступним чином:

//If value is negative...
if ( value < 0 ) {
  //...negate it (make it a negative negative-value, thus a positive value).
  value = negate(value);
}

Існує 2 способи заперечення значення:

  1. Ну, заперечуючи його значення: value = (-value);
  2. Перемноживши його на "100% -ний мінус", або "-1": value = value * (-1);

Обидва - це фактично дві сторони однієї монети. Просто ти зазвичай не пам'ятаєш, що value = (-value);насправді value = 1 * (-value);.


Щодо того, як ви насправді це робите на Java, це дуже просто, тому що Java вже забезпечує функцію для цього Math class:value = Math.abs(value);

Так, це зробити без Math.abs()просто рядка коду з дуже простою математикою, але чому ваш код виглядає некрасивим? Просто використовуйте надану Math.abs()функцію Java ! Вони надають це з причини!

Якщо вам абсолютно потрібно пропустити функцію, ви можете використовувати value = (value < 0) ? (-value) : value;, що є просто більш компактною версією коду, про який я згадував у логічному (3-му) розділі, використовуючи оператор Ternary ( ? :) .


Крім того, можуть бути ситуації, коли ви хочете завжди представляти втрату або відсутність у функції, яка може отримувати як позитивні, так і негативні значення.

Замість того, щоб робити складну перевірку, ви можете просто отримати абсолютне значення та заперечити це: negativeValue = (-Math.abs(value));


Зважаючи на це, і розглядаючи випадок із сумою кількох чисел, таких як ваше, було б непоганою ідеєю реалізувати функцію:

int getSumOfAllAbsolutes(int[] values){
  int total = 0;
  for(int i=0; i<values.lenght; i++){
    total += Math.abs(values[i]);
  }
  return total;
}

Залежно від ймовірності, що вам знову може знадобитися пов’язаний код, може бути також хорошою ідеєю додати їх до власної бібліотеки "утиліти", розбивши спочатку такі функції на їх основні компоненти та підтримуючи остаточну функцію просто як гніздо викликів до Тепер розбиті функції основних компонентів:

int[] makeAllAbsolute(int[] values){
  //@TIP: You can also make a reference-based version of this function, so that allocating 'absolutes[]' is not needed, thus optimizing.
  int[] absolutes = values.clone();
  for(int i=0; i<values.lenght; i++){
    absolutes[i] = Math.abs(values[i]);
  }
  return absolutes;
}

int getSumOfAllValues(int[] values){
  int total = 0;
  for(int i=0; i<values.lenght; i++){
    total += values[i];
  }
return total;
}

int getSumOfAllAbsolutes(int[] values){
  return getSumOfAllValues(makeAllAbsolute(values));
}


2

Якщо вас цікавить механіка доповнення двох, ось це абсолютно неефективний, але показовий спосіб низького рівня:

private static int makeAbsolute(int number){
     if(number >=0){
        return number;
     } else{
        return (~number)+1;
     }
}

Чому це абсолютно неефективно? Я не бачу циклу, який робить його неефективним. Я щось пропустив?
aldok

2

Я рекомендую наступні рішення:

без веселощів:

    value = (value*value)/value

(Наведене фактично не працює.)

з веселощами:

   value = Math.abs(value);

14
хіба перший не повторить негативне число?
користувач2875404

1
String s = "-1139627840";
BigInteger bg1 = new BigInteger(s);
System.out.println(bg1.abs());

Як варіант:

int i = -123;
System.out.println(Math.abs(i));

1

Функція бібліотеки Math.abs()може бути використана.
Math.abs()повертає абсолютне значення аргументу

  • якщо аргумент негативний, він повертає заперечення аргументу.
  • якщо аргумент позитивний, він повертає число таким, яким воно є.

наприклад:

  1. int x=-5;
    System.out.println(Math.abs(x));

Вихід: 5

  1. int y=6;
    System.out.println(Math.abs(y));

Вихід: 6


1

Для перетворення від'ємного числа в додатне число (це називається абсолютним значенням) використовується Math.abs (). Цей метод Math.abs () працює так

“number = (number < 0 ? -number : number);".

Наведений нижче приклад Math.abs(-1)перетворить негативне число 1 у позитивне 1.

приклад

public static void main (String [] args) {

    int total = 1 + 1 + 1 + 1 + (-1);
    
    //output 3
    System.out.println("Total : " + total);
    
    int total2 = 1 + 1 + 1 + 1 + Math.abs(-1);
    
    //output 5
    System.out.println("Total 2 (absolute value) : " + total2);
    
}

Вихідні дані

Всього: 3 Всього 2 (абсолютна величина): 5


0

Мені потрібне було абсолютне значення довго, і я заглянув глибоко в Math.abs і виявив, що якщо мій аргумент менший за LONG.MIN_VAL, який становить -9223372036854775808l, то функція abs не поверне абсолютне значення, а лише мінімальне значення. У цьому випадку, якщо ваш код надалі використовує це значення abs, може виникнути проблема.


4
Вся справа в Long.MIN_VAL полягає в тому, що ви не можете мати довгий, який "менше, ніж LONG.MIN_VAL".
Пол Томблін

0

Чи можете ви спробуйте це?

public static int toPositive(int number) {
    return number & 0x7fffffff;
}

4
На десятирічне запитання з 17 іншими відповідями ви повинні пояснити, який новий аспект питання стосується вашої відповіді. Почати відповідь на запитання - це хороший спосіб закрити його, якщо він опинився в черзі на огляд.
Джейсон Аллер


-3

не роби цього

число = (число <0? -кілька: число);

або

якщо (число <0) число = -число;

це буде помилка, коли ви запустите find bug на своєму коді, він повідомить про це як RV_NEGATING_RESULT_OF

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.