-2

1<=n<=10^5 の数値 n を入力しています。長さnの数が必要です。だから私は pow(10,n-1) を使用しますが、n=100000 の場合は機能しません。エラーは何ですか?

編集: そのコードフォース div2 ラウンド 152 問題 B.

Chilly Willy は、Willy が既に知っているすべての数 (2、3、5、および 7) で同時に割り切れるような、長さ n の最小数を見つけたいと考えています。それを手伝ってください。

数値の長さは、先行ゼロを除いた 10 進数表現の桁数です。

入力 単一の入力行には、単一の整数 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の組み込みタイプを使用することはできません。100000桁の数値を計算するには、300000ビット(数キロバイト)以上が必要です。これは決して簡単なことではありません。代わりに、計算せずに答えを印刷できます!doublelong

numが2、3、5、7で割り切れると言うのは、と同じnum % 210 == 0です。したがって、あなたの質問に対する答えは次のようになります。

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

必要なのは、2桁のxとyを見つけて、上記の「数字」を印刷することだけです。

したがって、を計算pow(10, 99999) % 210せずに計算する必要がありますpow(10, 99999)。それを行うには、最初にpow(10, 0) = 110を続けて乗算します。

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 ビットの浮動小数点データ型 (floatおよびdouble) の場合、次の範囲に制限されます。

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 に答える