我的目标是取一个整数,我的例子是197,检查它是否是素数,如果它是素数,旋转数字并检查素数直到我回到197,否则打破外观。我打算通过大量的数字来完成这项工作。
我使用的第一种方法是myPow。它用于获取长int功率(如2 ^ 20)。
long myPow(long x, long p) {
if (p == 0) { return 1; }
if (p == 1){ return x; }
return x * myPow(x, p - 1);
}
此功能计算位数。
int numdigits(long r){
unsigned int number_of_digits = 0;
do {
++number_of_digits;
r /= 10;
} while (r);
return number_of_digits;
}
这会检查素性。
bool isPrime(unsigned long long n) {
if (n <= 3) {
return n > 1;
}
if (n % 2 == 0 || n % 3 == 0) {
return false;
}
for (unsigned long long i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0) {
return false;
}
}
return true;
}
这需要一个整数并将数字拆分成一个向量 (整数123 - >向量(1,2,3))
vector<int> digits(int x){
vector<int> myvec;
while (x >= 10){
myvec.push_back(x % 10);
x = x / 10;
}
myvec.push_back(x);
reverse(myvec.begin(), myvec.end());
return myvec;
}
这是主要课程 它遍历每个整数,检查它是否为素数。如果它是素数,我用k来比较它,因为它最终会旋转到自身,而while看起来会完成。我将标志设置为true,当数字的不同旋转无法为素数时设置为false,并且在循环结束后,它将不计算整数。 我创建了矢量mydigs来存储数字,让h =数字位数。我指定a = h以避免在while循环中计算numdigits(i)。
这是我认为出了问题的地方。我旋转一次,我将k指定为整数。我检查是否是素数,如果没有,则将break和set flag设置为false。否则它将继续循环并继续旋转。问题是,当我在197年运行时,我知道每次旋转整数时都是素数,我最终失败了,因为当我第二次旋转时,我得到了错误的数字。这就是我输出k的原因,只是为了看看出错的原因。
应该是什么输出:
971 719, 1
输出我得到:
971 1690,&lt; - 这个我不明白。 0,
int main(){
unsigned t0 = clock();
int totalcircle = 0;
for (int i = 197; i < 198; i += 2){
if (isPrime(i)){
long k = 0;
bool flag = true;
vector<int> mydigs = digits(i);
int h = numdigits(i);
int a;
while (i != k){
a = h;
rotate(mydigs.begin(), mydigs.begin()+1, mydigs.end());
for (vector<int>::iterator it = mydigs.begin(); it != mydigs.end(); ++it){
k += (*it) * myPow(10, a - 1);
a--;
}
std::cout << k << std::endl;
if (!isPrime(k)){
flag = false;
break;
}
}
if (flag){
std::cout << i << endl;
totalcircle++;
}
}
}
std::cout << totalcircle << endl;
unsigned elapsed = clock() - t0;
std::cout << "Elapsed time: " << elapsed << endl;
std::system("pause");
return 0;
}
答案 0 :(得分:1)
您可以使用std::rotate
代替您的功能,如下所示
#include <iostream>
#include <algorithm>
#include <vector>
int main () {
std::vector<int> myvector={1,9,7};
std::rotate(myvector.begin(),myvector.end()-1, myvector.end());
std::cout << "myvector contains:";
for ( auto &x : myvector)
std::cout<<x;
std::cout << '\n';
return 0;
}