大量使用pow(x,y)

时间:2012-11-25 16:38:41

标签: c++ math.h

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

编辑:它的代码强制div2第152轮问题B.

Chilly Willy希望找到长度为n的最小数量,这样它就可以被威利已经知道的所有数字整除(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;
}

2 个答案:

答案 0 :(得分:2)

与大数字合作并非易事;您不能只使用内置类型,例如intdoublelong等。为了计算一个100000位的数字,你需要有超过300000位(几千字节);这绝非易事。相反,你可以打印答案而不计算它!

表示数字num可被2,3,5和7整除,与num % 210 == 0相同。所以问题的答案如下:

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

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

因此,您必须在不计算pow(10, 99999) % 210的情况下计算pow(10, 99999)。要做到这一点,请从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次1,然后打印0

答案 1 :(得分: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位的数字。因此,它失败了(在某种程度上),虽然你还没告诉我们它是如何失败的。