所以我有以下问题:
下个月将在这个城市召开一次大型会议。朋友通常 往往会到达并注册在一起,所以他们也最终坐在旁边 互相和他们已经认识的人聊天。在 为了让事情变得更有趣,会议组织者想出了 一个系统“洗牌”服务员的顺序,从而得到他们 结识新朋友。
系统的工作原理如下:第一个到达的人 会议注册获得随机选择的数字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]时它会中断。 任何的想法?
答案 0 :(得分:1)
即使没有查看代码,我也可以说整数溢出不应该成为signed int
的问题:
31337² = 982,007,569
,111010100010000011111100010001
,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;
}