この質問は、より一般的なプログラミングの問題を解決する必要があります:任意の長さL番号から、Kビットの連続した素数の数は最初から構成される登場見つけます。
入力フォーマット:
入力は2つの正の整数の最初の行に与えられ、L(正の整数ではない1000以上、デジタル長さ)、及びK(10未満の整数正)です。次の行は、正の整数Nの長さLが与えられます
出力フォーマット:
Kビットの素数N個の連続最初に出現からなる出力線の数。そのような素数が存在しない場合は、出力404。先行ゼロ元の数もの桁数にカウントされることに留意されたいです。一例では、ビット素数2002364、0023 BEの解決策を見つけること; 2しかし、第二の出力0002として扱うことができないので、元の図2における先行ゼロが存在しません。
サンプル入力1:
205
23654987725541023819
出力サンプル1:
49877
入力サンプル2:
10 3
2468024680
出力サンプル2:
404
アイデアは:この数は素数ではなく、プログラムが終了するが、そうでない場合、続ける場合は出力され、デジタル入力文字列は、SUBSTR関数の決意を記録します。あなたは、サイクルの終わりが見つからなかった場合、何の説明、出力404はありません。
*私はもともとループの判定条件のために書いた私は<= s.size()である- K 、 しかし、テストポイント4間違っていると、それが理由は不明です。
#include <iostream>
#include <string>
using namespace std;
bool isprime(int n);
int main()
{
string s;
int l, k;
cin >> l >> k >> s;
for (int i = 0; i <= l - k; i++) //注意判断条件是小于等于,等于的时候取的是最后一段
{
string ans = s.substr(i, k);
int num = stoi(ans); //将ans转换为int型,能取消前导0
if (isprime(num))
{
cout << ans;
return 0;
}
}
cout << 404;
return 0;
}
bool isprime(int n)
{
if (n < 2) return false;
for (int i = 2; i * i <= n; i++)
if (n % i == 0)
return false;
return true;
}