所以,我有以下问题:C++长长的诠释
会有下个月在全市大型会议。通常朋友 倾向于到达并一起注册,所以他们最后也会坐在对方 和他们已经知道的人聊天。在 为了让事情有点发挥,会议组织者想出了一个系统来“洗牌”服务员的顺序,并因此,让他们 结识新朋友。
该系统的工作原理如下:第一个到达 会议注册的人获得一张票号为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)其中票号为 递增顺序,parentesis中的数字为原始参与者到达会议的 。
继续这个顺序,第四,第五和第六个参与者 将得到票号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]时显示中断。 有什么想法?
您可以通过使用范围检查数字来检查数字范围是否被超出。 C++没有内置的或标准的库支持,但它很容易实现(虽然有些工作)。也许Boost lib有一些支持,或者说,只是谷歌。 – 2014-10-18 09:04:44
整数溢出 – Creris 2014-10-18 09:14:34
好的隐藏变量名称和未命名的显式循环。 – rightfold 2014-10-18 09:16:42