абсолютное значение / вычитание

Я пытаюсь решить проблему, которая говорит:

Напишите программу, которая вычисляет разницу между неотрицательными целыми числами.

Входные данные:

Каждая строка ввода состоит из пары целых чисел. Каждое целое число от 0 до 10, повышенное до 15 (включительно). Ввод завершается концом файла.

Выход:

Для каждой пары целых чисел на входе выведите одну строку, содержащую абсолютное значение их разности.

Вот мое решение:

#include <iostream>
#include <cmath>
using namespace std;

int main(){
int x;
int y;
int z;

cin >> x >> y;

if(x && y <= 1000000000000000){
z=x-y;
cout << std::abs (z);
}
}

Но проблема в том, что мой ответ неверный, пожалуйста, помогите мне исправить мой ответ и объяснить, почему он был неправильным.

0

Решение

Для начинающих обычно диапазон допустимых значений для объектов типа int меньше чем 1000000000000000,
Вы должны использовать целочисленный тип достаточно широкий, чтобы хранить такие большие значения. Соответствующий тип unsigned long long int потому что согласно заданию введенные значения неотрицательны.

В противном случае вам также необходимо проверить, что значения не являются отрицательными, которые больше или равны нулю.

Также условие в операторе if

if(x && y <= 1000000000000000){

неправильно. Это эквивалентно

if(x && ( y <= 1000000000000000 )){

что в свою очередь эквивалентно

if( ( x != 0 ) && ( y <= 1000000000000000 )){

это не то же самое, что

if ( ( x <= 1000000000000000 ) && ( y <= 1000000000000000 ) ){

Программа может выглядеть следующим образом

#include <iostream>

int main()
{
const unsigned long long int UPPER_VALUE = 1000000000000000;
unsigned long long int x, y;

while ( std::cin >> x >> y )
{
if ( x <= UPPER_VALUE && y <= UPPER_VALUE )
{
std::cout << "The difference between the numbers is "<< ( x < y ? y - x : x - y )
<< std::endl;
}
else
{
std::cout << "The numbers shall be less than or equal to "<< UPPER_VALUE
<< std::endl;
}
}
}

Если например ввести эти значения

1000000000000000 1000000000000000
1000000000000001 1000000000000000
1 2

тогда вывод программы будет выглядеть

The difference between the numbers is 0
The numbers shall be less than or equal to 1000000000000000
The difference between the numbers is 1
1

Другие решения

Ваше условие if неверно, как уже упоминалось другими. Ваша переменная x приводит к true для каждого значения, кроме нуля. Так что вы должны написать (х <= МАКС && Y <= МАКС.)

Также вы можете запретить использование фиксированных максимальных значений покупки с помощью функции numeric_limits (пределы библиотеки):

#include <iostream>
#include <limits>
#include <cmath>

int main() {
int x;
int y;
int z;

std::cin >> x >> y;

if (x <= std::numeric_limits<long>::max() && y <= std::numeric_limits<long>::max()) {
z=x-y;
std::cout << std::abs (z);
}
}
0

Ваше состояние написано неправильно. Это должно было быть

if(x <= 1000000000000000 && y <= 1000000000000000) {
z=x-y;
cout << std::abs (z);
}

Тем не менее, ваше состояние if(x && y <= 1000000000000000) оценивает на простом английском if x is true AND y is less than or equal to 1000000000000000что, безусловно, не то, что вы хотите. То, как вы это сделали, условие оценивает как истинное, когда y меньше чем 1000000000000000 А ТАКЖЕ x любое значение, кроме нуля, положительный или отрицательный. Причиной этого является то, что в C любое ненулевое значение имеет значение true.

Заметка: ваш код потерпит неудачу, когда x а также y присваиваются любые значения вне диапазона int что от -2 ^ 31 до 2 ^ 31-1 (учитывая int быть 32 бита, что является наиболее распространенным). Вы должны использовать long long тип данных для x, y а также z Вот.

long long x, y, z;

long long имеет диапазон от -2 ^ 63 до 2 ^ 63-1, который является достаточно большим, чтобы вместить любое число в пределах указанного диапазона, а именно 0 в 1000000000000000,

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector