C++ 鸽子洞/多个数字 input:integer(我称之为N)和(1)输出:70(70 mod 2==0) #包括 #包括 使用名称空间std; typedef long-long-ll; int remaind(字符串数,ll m) { ll mod=0; 对于(int i=0;i>n; ans.append(n,'7'); 对于(int i=ans.length()-1;i>=0;i--) { if(remind(ans,n)==0) { cout
您的方法是错误的,假设您将“70”除以5。那么您的结果将是2,这是不正确的(只需分析您的代码,看看为什么会发生这种情况) 您可以根据777 0000000这样的数字进行搜索,但请仔细想想——哪些数字需要加零,哪些数字不需要加零 下一步,不要使用字符串!如果您知道a的提醒和b的提醒,请考虑a*b的提醒。编程时,请注意整数大小,使用64位整数 那么a+b呢 最后,查找数字10、100、1000、10000等的提醒(同样,不要使用字符串,仍然尝试查找10的任何幂的提醒)C++ 鸽子洞/多个数字 input:integer(我称之为N)和(1)输出:70(70 mod 2==0) #包括 #包括 使用名称空间std; typedef long-long-ll; int remaind(字符串数,ll m) { ll mod=0; 对于(int i=0;i>n; ans.append(n,'7'); 对于(int i=ans.length()-1;i>=0;i--) { if(remind(ans,n)==0) { cout,c++,C++,您的方法是错误的,假设您将“70”除以5。那么您的结果将是2,这是不正确的(只需分析您的代码,看看为什么会发生这种情况) 您可以根据777 0000000这样的数字进行搜索,但请仔细想想——哪些数字需要加零,哪些数字不需要加零 下一步,不要使用字符串!如果您知道a的提醒和b的提醒,请考虑a*b的提醒。编程时,请注意整数大小,使用64位整数 那么a+b呢 最后,查找数字10、100、1000、10000等的提醒(同样,不要使用字符串,仍然尝试查找10的任何幂的提醒) 好吧,如果你能做到这一切,你就
好吧,如果你能做到这一切,你就能很容易地解决整个问题。我可以推荐任何整数类吗 我怀疑
uint1024\u t
(或者其他什么……它们也有128、256和512位整数,并且您可以很容易地声明自己的整数)将满足您的需要,允许您执行单个%
,而不是每次迭代执行一个。这可能会超过使用bignum vs c++内置整数时所损失的性能
2^1024~=1.8e+308。足以表示任何308位数字。这可能太多了
2^512~=1.34e+154。适用于任何154位数字
等等
我想你应该先写一个循环,经过n=4e+6->5e+6,写出哪个字符串最长,然后适当调整uint*\t的大小。如果最长的字符串长度超过308个字符,你可以自己编写:
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;
}
typedef number myreallunsignedbigint;
模运算符可能是该内循环中最昂贵的操作。在外循环上而不是在内循环上执行一次迭代(O(n)vs O(n^2))可以节省大量时间
这将加上整个“不去和来自字符串”的东西来支付Bigunm的开销吗?你必须试试看。< /P>但是,如果n是4999999,那么答案就很容易超过(长长)类型,这就是为什么我用字符串作为输出。是的,我们可以考虑数字A=3456789和B=2345678,并试图找到。(a*b)%4999999。你能用64位int完成吗?现在,那((a*b)*(a*b))呢%4999999?你必须想一想,这不是一项简单的任务,但也不是太难。请不要将问题编辑成答案,或在标题中添加已解决的问题。要将问题标记为已解决,请接受其中一个答案。如果你自己解决了问题,则可以发布答案并接受。你不需要在标题中添加
已解决的,正确的方法是如果你已经解决了你的问题,那就是接受了一个答案,你已经接受了。另外,请不要将你最终得到的答案添加到问题中。将其作为答案发布。非常感谢你的回答,很抱歉我没有正确编辑我的帖子。我实际上用字符串解决了这个问题。
typedef number<cpp_int_backend<LENGTH, LENGTH, unsigned_magnitude, unchecked, void> > myReallyUnsignedBigInt;