C ++ long long int

时间:2014-10-18 09:02:07

标签: c++ long-integer

所以我有以下问题:

  

下个月将在这个城市召开一次大型会议。朋友通常   往往会到达并注册在一起,所以他们也最终坐在旁边   互相和他们已经认识的人聊天。在   为了让事情变得更有趣,会议组织者想出了   一个系统“洗牌”服务员的顺序,从而得到他们   结识新朋友。

     

系统的工作原理如下:第一个到达的人   会议注册获得随机选择的数字a1的票   由组织者。到达以下每个人都会得到一个新的   票号为ai =(ai - 1×31334)mod 31337,并找到它   队列中的相应位置,就在最后一个人的后面   数字小于或等于ai。这意味着票号   在队列中应始终按顺序,如果已经有很多   数量相同的人,最新到的应该是最后一个   在那个小组中。

     

您的任务是编写一份有助于服务员的计算机程序   找到他们在队列中的正确位置。

     

示例给定初始票号a1 = 7546,找到位置   在第6个人到达的队列中。所以这里的输入是[7546,   6]。

     

讨论:第一个到达的人获得机票a1 = 7546和   站在队列的前面。第二个人获得机票a2   =(7546×31334)mod 31337 = 8699,因此位于队列中的第二个位置。然后到达的第三个人获得票   数字a3 =(8699×31334)mod 31337 = 5240因此获得   跳入队列并站在1号位置,让其他人进入   队列一个位置到后面。也就是说,队列现在看起来像:

     

1:5240(3),2:7546(1),3:8699(2)票号在   增加顺序和肠胃外的数量是最初的顺序   参与者到达会议。

     

继续这个序列,第四,第五和第六个参与者   将获得票号a4 = 15617,a5 = 15823和a6 = 15205;所以   然后队列看起来像:

     

1:5240(3),2:7546(1),3:8699(2),4:15205(6),5:15617(4),6:   15823(5)就是说,第6个到达的人站在了   队列中的第4位。

     

答案:4

以下c ++代码:

#include <iostream>
using namespace std;
int main ()
{
    int n, i, poz, ok;
    long long int a, v[100], aux;
    cout << "v[1]= "; cin >> v[1];
    cout << "n= "; cin >> n;
    for (i=2; i<=n; i++)
        v[i]=(v[i-1]*31334)%31337;
    a=v[n]; 
    do
    {
        ok=0;
        for (i=1; i<n; i++)
            if (v[i]>v[i+1])
            {
                aux=v[i];
                v[i]=v[i+1];
                v[i+1]=aux;
                ok=1;
            }
    }while (ok==1);
    for (i=1; i<=n; i++)
        if (v[i]==a)
            poz=i;
    cout << poz;
    return 0;
}

它为小数字显示正确的东西,但是当我输入较大的数字时,这就出现了问题,因为它只是破坏了。 例如,它为[7253,10]显示4,为[24284,10]显示1,但是当我输入[12879,505]时它会中断。 任何的想法?

2 个答案:

答案 0 :(得分:1)

即使没有查看代码,我也可以说整数溢出不应该成为signed int的问题:

31337² = 982,007,569111010100010000011111100010001,30位数字。

因此,此处的计算在任何时候都不应超过MAX (2^31)-1 = 2,147,483,647。 就像琐事一样,long long int会支持最多(2^63)-1 = 9,223,372,036,854,775,807的数字。

现在需要做的是调试代码......

根据您的错误 - 我认为问题在于您定义了大小为100的arrav v,并尝试查找第505个元素 - 这实质上是非法的内存访问,因此无法预测。 你在自己的代码上做了缓冲区溢出:)

除此之外,我建议您花一些时间来组织代码 - #define或为常量添加const值(数组大小,31337,31333等) 请记住,C ++中的数组以v[0]开头,而不是v[1] - 无论文本描述的是什么。这是个错误。 使用块for封装您的if{ }语句,即使您只有一个表达式 - 或者在将来添加代码时,您会忘记它们并拥有&#34;乐趣&#34;时间调试它。

作为一般性建议 - 为自己保留一些悲伤并养成使用Yoda案例的习惯:1 == ok而不是ok == 1,因为将其变为ok = 1的拼写错误会导致您非常讨厌错误。

答案 1 :(得分:1)

您应该考虑使用向量并推回值。

但是你的阵列越界越界。您创建了一个大小为100的数组,并且您在上次测试运行时尝试使用505个空格。

因此,要么使用向量并按下push_back值,要么增加数组的大小。为了便于使用,我建议使用矢量。

以下是我使用容器和STL函数为您完成大部分工作来解决问题的方法。希望这对你有所帮助。 =)

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

using LONG64 = long long;

const int MULTIPLIER = 31334;
const int MOD = 31337;

int main()
{
    vector<LONG64> ticket;

    cout << "v[1]= ";
    LONG64 seed;
    cin >> seed;
    ticket.emplace_back(seed);

    cout << "n= ";
    int queue_spot;
    cin >> queue_spot;

    for (auto i = 1; i <= queue_spot; ++i) {
        auto seed_number = (ticket[i - 1] * MULTIPLIER) % MOD;
        //cout << "\nseed_number " << seed_number;
        ticket.emplace_back(seed_number);
    }

    LONG64 person_ticket_number = ticket[queue_spot - 1];

    cout << "\nPerson's ticket number " << person_ticket_number;

    sort(ticket.begin(), ticket.end());

    auto spot = find(ticket.begin(), ticket.end(), person_ticket_number);

    cout << "\nPerson is in spot " << (spot - ticket.begin()) + 1 << endl;

    system("PAUSE");
    return 0;
}
相关问题