Gdzie przekraczam rozmiar INT?

0

Mam taki kod:

#include <bits/stdc++.h>
    
using namespace std;
    
#define ll long long
#define ull unsigned long long
    
#define fi first
#define se second
    
#define FOR(x, y, z) for (int z = x; z < y; z++)
#define FORD(x, y, z) for (int z = x; z > y; z--)
    
const int INF = 1e9 + 7;
    
void solve(){   
    int n, k;
    cin >> n >> k;
    if (n % k == 0){
        cout << 1 << "\n";
        return;
    }
    int new_k = k;
    while (new_k < n){
        new_k += k;
    }
    cout << (new_k + n-1) / n << "\n";
}   
    
void testcases(){
    int t;
    cin >> t;
    while(t){
        solve();
        t--;
    }
}
    
int main(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    testcases();
    //solve();
    return 0;
}

Dla większych danych zaczyna dawać -1
https://ideone.com/2QJGU8

Nie potrafię znaleźć miejsca gdzie int zostałby przeładowany. Gdy zmienię na long long int to wszystko działa poprawnie.

5

Wypadałoby opisać co ten kod ma robić, bo ze zmiennymi nazwanymi w ten sposób większość czasu spędziłem na próbie zrozumienia kodu...

int32 max = 2^³¹-1, czyli ok 2.15 * 109

    while (new_k < n){
        new_k += k;
    }
    cout << (new_k + n-1) / n << "\n";

dla k = 999 999 999 i n = 1 000 000 000
new_k to 1 999 999 998 po pętli
new_k + n-1 to 2 999 999 997, tylko że to już ponad int.

To idealne zadanie do nauki użycia debuggera.

PS: WTF te define'y. do ioccc z tym

1

Czyżby próbowałeś napisać coś takiego:

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

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(nullptr);
    cout.tie(nullptr);
    istream_iterator<int> sin(cin);
    ostream_iterator<int> sout(cout,"\n");
    for(int t=*sin;t--;)
    {
    	long long n=*(++sin),k=*(++sin);
    	*(sout++)=(k*((n+k-1)/k)+n-1)/n;
    }
    return 0;
}

https://ideone.com/nfo044

1
Suchy702 napisał(a):

Dla większych danych zaczyna dawać -1
https://ideone.com/2QJGU8

Nie potrafię znaleźć miejsca gdzie int zostałby przeładowany. Gdy zmienię na long long int to wszystko działa poprawnie.

Wędka zamiast ryby.

example.cpp:27:20: runtime error: signed integer overflow: 1999999998 + 1000000000 cannot be represented in type 'int'
1
Suchy702 napisał(a):

Mam taki kod:

#define ll long long
#define ull unsigned long long
    
#define fi first
#define se second
    
#define FOR(x, y, z) for (int z = x; z < y; z++)
#define FORD(x, y, z) for (int z = x; z > y; z--)

Nie wiem kto cię uczy używać takich makr, ale unikaj ich jak się da (jako początkujący długo nie będziesz miał konieczności używania własnych makr - nie licząc strażników nagłówków).

Alternatywa:

using ll = long long;
using ull = unsigned long long;

Dla FOR masz range based loop.
Nie rób nigdy makr fi i se i ich odpowiedników, to zaciemnia kod i jest bardzo niebezpieczne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1