-2

我正在输入一个数字 n,其中 1<=n<=10^5。我需要一个长度为 n 的数字。所以我使用 pow(10,n-1) 但是当 n=100000 时它不起作用。错误是什么?

编辑:它的 codeforces div2 第 152 轮问题 B。

Chilly Willy 想要找到长度为 n 的最小数,这样它就可以同时被所有 Willy 已经知道的数(2、3、5 和 7)整除。帮助他。

数字的长度是十进制表示中不带前导零的位数。

输入 单个输入行包含单个整数 n (1 ≤ n ≤ 10^5)。

我的代码可以工作到 n=19。它在预测试 9 中失败。

#include<iostream>
#include<math.h>
using namespace std;

int main()
{
int f=0;
unsigned long long n;unsigned long long out;
cin>>n;
unsigned long long num=1;unsigned long long lim=10;
for(unsigned long long z=0;z<n;z++)
{num=num*10;lim=lim*10;}num=num/10;lim=lim/10;
for(;num<lim;num++)
{
if((num%2==0)&&(num%3==0)&&(num%5==0)&&(num%7==0)){f=1;out=num;break;}
}

if(f==1){cout<<out;}
else if(f==0){cout<<"-1";}

return 0;
}
4

2 回答 2

2

处理大数并非易事。您不能为此仅使用 , , 等int内置double类型。long为了计算一个有 100000 位的数字,你需要有超过 300000 位(几千字节);这绝非易事。相反,您可以在不计算的情况下打印答案!

说一个数num能被 2、3、5 和 7 整除与num % 210 == 0. 因此,您的问题的答案如下所示:

100000000000... (really many zeros) ...00000xy0

您只需要找到两个数字 x 和 y,然后打印上面的“数字”。

所以你必须计算pow(10, 99999) % 210而不计算pow(10, 99999)。为此,请从 10 开始pow(10, 0) = 1并依次乘以 10:

pow(10, 0) % 210 = 1
pow(10, 1) % 210 = (1   * 10) % 210 = 10
pow(10, 2) % 210 = (10  * 10) % 210 = 100
pow(10, 3) % 210 = (100 * 10) % 210 = (1000 % 210) = 160
pow(10, 4) % 210 = (160 * 10) % 210 = (1600 % 210) = 130
pow(10, 5) % 210 = (130 * 10) % 210 = (1300 % 210) = 40
...

以这种方式计算后pow(10, 99999) % 210(假设它是xyz),相加210 - xyz将使数字可被 210 整除。因此,要输出答案,请打印1,然后打印 99996 次0,然后打印210 - xyz

于 2012-11-25T18:41:25.333 回答
1

对于典型的 32 位和 64 位浮点数据类型(floatdouble),它们被限制在以下范围内:

float:  3.4E +/- 38  (that is, 3.4 * 10^(+/-38))  (with 7 digits of precision)
double: 1.7E +/- 308 (that is, 1.7 * 10^(+/-308)) (with 15 digits of precision)

具有 100000 位数字的数字完全超出了这些数据类型的范围。因此,它失败了(以某种方式),尽管你没有告诉我们它是如何失败的。

于 2012-11-25T16:43:44.573 回答