鸽子洞/多个数字

pigeon hole / multiple numbers

本文关键字:数字 鸽子      更新时间:2023-10-16
input : integer ( i'll call it N ) and (1 <= N <= 5,000,000 )
output : integer, multiple of N and only contains 0,7 
Ex.
Q1 input : 1 -> output : 7 ( 7 mod 1 == 0 )
Q2 input : 2 -> output : 70  ( 70 mod 2 == 0 )
#include <string>
#include <iostream>
using namespace std;
typedef long long ll;
int remaind(string num, ll m)
{
ll mod = 0;
for (int i = 0; i < num.size(); i++) {
int digit = num[i] - '0';
mod = mod * 10 + digit;
mod = mod % m;
}
return mod;
}

int main()
{
int n;
string ans;
cin >> n;
ans.append(n, '7');
for (int i = ans.length() - 1; i >= 0; i--)
{
if (remaind(ans, n) == 0)
{
cout << ans;
return 0;
}
ans.at(i) = '0';
}
return 0;
}

有没有办法减少时间的复杂性?

我只是非常努力地尝试了,当n超过1000000 时,运行需要多一点时间

ps。更改的代码ps2.由于代码错误,再次更改代码ps3.再次优化代码ps4.重写后

您的方法是错误的,假设您将"70"除以5。然后您的结果将是2,这是不对的(只需分析您的代码,看看为什么会发生这种情况(。

你真的可以根据77777770000000这样的数字进行搜索,但要更多地考虑这一点——哪些数字需要加零,哪些数字不需要。

接下来,不要使用字符串!如果你知道a的提醒和b的提醒,可以考虑a*b的提醒。当你编程它时,要小心整数大小,使用64位整数。

那么,a+b呢?

最后,找到数字10、100、1000、10000等的提醒(再次,不要使用字符串,仍然尝试找到10次方的提醒(。

好吧,如果你做到这一切,你就能轻而易举地解决整个问题。

我可以推荐任何boost::bignum整数类吗?

我怀疑uint1024_t(或者其他什么……他们也有128、256和512位的int,已经被类型化了,你可以很容易地声明自己的int(会满足你的需求,允许你执行一个%,而不是每次迭代一个。这可能会超过使用bignum与c++的内置int时所损失的性能。

2^1024~=1.8e+308。足以代表任何308位数字。这可能太过分了。

2^512~=1.34e+154。适用于任何154位数字。

等等。

我怀疑你应该先写一个循环,通过n=4e+6->5e+6,写出哪个字符串最长,然后适当地调整uint*_t的大小。如果最长的字符串长度超过308个字符,您可以创建自己的:

typedef number<cpp_int_backend<LENGTH, LENGTH, unsigned_magnitude, unchecked, void> > myReallyUnsignedBigInt;

模运算符可能是该内部循环中最昂贵的运算。在外循环上而不是在内循环上执行每次迭代一次(O(n(vs O(n^2((应该会节省相当多的时间。

再加上整个"不去串"的事情会为bignum的开销买单吗?你得试试看。