Я пытаюсь решить проблему, которая говорит:
Напишите программу, которая вычисляет разницу между неотрицательными целыми числами.
Каждая строка ввода состоит из пары целых чисел. Каждое целое число от 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);
}
}
Но проблема в том, что мой ответ неверный, пожалуйста, помогите мне исправить мой ответ и объяснить, почему он был неправильным.
Для начинающих обычно диапазон допустимых значений для объектов типа 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
Ваше условие 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);
}
}
Ваше состояние написано неправильно. Это должно было быть
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
,