Prateek Krishna Ответов: 3

Что в этом плохого? Это показывает неправильный ответ.


Operation 1: Find A raised to the power of B.
Operation 2: Find A raised to the power of B, then XOR of the result with the number C.
Operation 3: Find A raised to the power of B, then divide the result by C and print the remainder.

Input:
First line contains number of testcases T. For each testcase, there will be single line containing  three positive integers A, B and C.

Output:
For each testcase, print the required answer.


Что я уже пробовал:

#include<bits/stdc++.h>
using namespace std;
void operations(int a, int b, int c);
int main(){
    
    int testcase;
    cin >> testcase;
    
    while(testcase-- > 0){
        
        int a, b, c;
        
        cin >> a >> b >> c;
        
        operations(a, b, c);
        
    }
}

void operations(int a, int b, int c){
    
    int d=pow(a,b);
    cout<<d<<endl;
    int e=d^c;
    cout<<e<<endl;
    int f=d%c;
    cout<<f<<endl;
}

CPallini

Что такое входные данные? Каков ожидаемый результат?

Prateek Krishna

Ограничения:
1 <= T <= 10
1 <= A <= 20
0 <= B <= 10
1 <= C <= 100

Пример:
Ввод:
1
5 2 3

Выход:
25
26
1

Patrice T

что такое фактический выход ?

Richard MacCutchan

В чем же проблема?

Prateek Krishna

это показывает неправильный ответ

Richard MacCutchan

Мне это кажется правильным. Как вы думаете, какими должны быть ответы?

Prateek Krishna

Существует скрытый тестовый случай, для которого выводом является "неправильный ответ".

Richard MacCutchan

И вы думаете, что каким-то образом мы можем догадаться, что это такое, и какой ответ он ожидает?

3 Ответов

Рейтинг:
2

OriginalGriff

Сделайте себе одолжение и посмотрите на свои ограничения:

Constratints:
1 <= T <= 10
1 <= A <= 20
0 <= B <= 10
1 <= C <= 100

ваша первая задача состоит в том, чтобы поднять A до степени B, поэтому предположим, что тест на ваши максимальные ограничения равен 20^10 : 1.024 e+13
Укладывается ли это в целое число?


Рейтинг:
1

CPallini

Одна из проблем в вашем коде-это выбранный тип данных: A возведенное в степень B для A=10, B=20 не укладывается в int тип данных (см. Фундаментальные типы - cppreference.com[^]). вы должны использовать long long тип данных. Следующая программа

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

using ull = unsigned long long;

void operations_ull(ull a, ull b, ull c){

    ull d =pow(a,b);
    cout << d << endl;
    ull e = d^c;
    cout << e << endl;
    ull f=d%c;
    cout << f << endl;
}

void operations_int(int a, int b, int c){

    int d =pow(a,b);
    cout << d << endl;
    int e = d^c;
    cout << e << endl;
    int f=d%c;
    cout << f << endl;
}

int main()
{
  int A = 20;
  int B = 10;
  int C = 99;
  printf("int data type\n");
  operations_int(A,B,C);
  printf("unsigned long long data type\n");
  operations_ull(A,B,C);
}

выходы
int data type
-2147483648
-2147483549
-2
unsigned long long data type
10240000000000
10240000000099
34


Рейтинг:
1

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поместите точку останова в первую строку метода и запустите приложение. Когда он достигнет точки останова, отладчик остановится и передаст управление вам. Теперь вы можете запускать свой код построчно (так называемый "одноступенчатый") и просматривать (или даже изменять) содержимое переменных по мере необходимости (черт возьми, вы даже можете изменить код и повторить попытку, если вам это нужно).
Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?
Надеюсь, это поможет вам определить, в какой части этого кода есть проблема и в чем она заключается.
Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!