Считайте из входных данных два значения и добавьте их, просто используя одну переменную .. возможно? - PullRequest
1 голос
/ 07 марта 2011

Салют ..

Давайте посмотрим на этот пример:

int x,y,s;
cin>>x>>y;
s=x+y;

здесь у нас есть три переменные для добавления двух значений ..

Можем ли мы сделать этотолько с одной переменной?

спасибо.

Ответы [ 8 ]

6 голосов
/ 07 марта 2011

Как насчет нулевых переменных?

#include <numeric>
#include <iterator>
#include <iostream>

int main()
{
  std::cout <<
    std::accumulate(
      std::istream_iterator<int>(std::cin),
      std::istream_iterator<int>(),
      0) <<
    "\n";
}
4 голосов
/ 07 марта 2011
struct Accumulator {
    int value;
    Accumulator(): value(0) {}
    friend std::istream& operator>>(std::istream& ss, Accumulator& acc)
    { int x; ss >> x; acc.value += x; return ss; }
};

int main() {
    Accumulator a;
    std::cin >> a >> a;
    std::cout << "Total is " << a.value << "\n";
    return 0;
}

Посмотрите, насколько полезна абстракция?

3 голосов
/ 07 марта 2011

Вы можете вырезать один, дважды используя оператор извлечения.

int x, s = 0;
cin >> x;
s += x;
cin >> x;
s += x;

Вы можете сократить это еще больше, используя одну переменную, которая в два раза больше int. Я не могу поверить, что я печатаю это:

long long s;
assert(sizeof(int)*2 == sizeof(long long));
cin >> *(int*)(&s);
cin >> *((int*)(&s)+1);
s = (s & 0xffffffff) + ((s >> 32) & 0xffffffff);

Вам разрешено делать подобные вещи только тогда, когда вам абсолютно необходимо что-то вроде сохранения двух 32-битных значений в 64-битном регистре по непонятным причинам производительности, иначе боги вас поразят. В таком случае вы, скорее всего, не используете библиотеку iostream, но все готово. Я пойду приму душ, чтобы смыть запах кода. Мне может понадобиться щелочь.

1 голос
/ 07 марта 2011

Возможно.

Очень важное примечание, int равно 16 бит.Код очень и очень длинный.Здесь много постоянных.Как то так.

int x;
cin >> x;

if (x == -32768) {
    cin >> x;
    x = x - 32768; 
} else if (x == -32767) {
    cin >> x;
    x = x - 32767; 
} else ...
...
} else if (x == -1) {
    cin >> x;
    x = x - 1;
} else if (x == 0) {
    cin >> x;
    x = x;
} else if (x == 1) {
    cin >> x;
    x = x + 1;
} else ...
...
} else if (x == 32766) {
    cin >> x;
    x = x + 32766;
} else {
    cin >> x;
    x = x + 32767;
}
cout << x << endl;
return 0;
0 голосов
/ 14 июня 2013

Я думаю, что ниже будет работать .....

#include<stdio.h>
int x=0;
int getno()
   {
     scanf("%d",&x);
     return x;
   }
int main()
   {
     x=getno()+getno();
     printf("addition of the number is = %d",x);
   }
0 голосов
/ 07 марта 2011
int main() {
        typedef long long int64;

        int64 x;
        cin >> ((int*)(&x))[0] >> ((int*)(&x))[1];
        x = ((int*)(&x))[0] + ((int*)(&x))[1];
        cout << x << endl;
        return 0;
}

Введите:

100 250

Выход

350

Посмотрите на себя в Ideone: http://ideone.com/2AmK0

Примечание: Я не знаю, насколько портативно это решение. Но это работает с gcc-4.3.4.

0 голосов
/ 07 марта 2011

Вы не можете, пока эта переменная int. Но почему ты так хочешь?

Конечно, от s можно избавиться x += y.

0 голосов
/ 07 марта 2011

Я знаю, что вы можете сократить его до 2 переменных, используя x+=y

Вам не разрешено делать что-то вроде cin<<x<<x+=y, что было бы единственным способом узнать, как сократить это значение до одной переменной.

...