【问题标题】:splitting digits of an integer into a vector, rotating them, then converting back to an integer将整数的数字拆分为向量,旋转它们,然后转换回整数
【发布时间】:2015-06-28 00:31:04
【问题描述】:

我的目标是取一个整数,我的例子是 197,检查它是否是素数,如果它是素数,旋转数字并检查素数,直到我回到 197,否则会破坏外观。我打算循环大量的数字来做到这一点。

我使用的第一个方法是 myPow。它用于取长整数幂(如 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 将其与 i 进行比较,因为最终它会旋转到自身并且 while 查找将完成。我将标志设置为真,当数字的不同旋转未能成为素数时,它设置为假,并且循环结束后,它不会计算整数。 我创建了向量 mydigs 来存储数字,让 h = 位数。我分配 a = h 以避免在 while 循环中计算 numdigits(i)。

这是我认为事情不对的地方。我旋转一次并将 k 指定为整数。我检查这是否是素数,如果不是,则中断并将标志设置为假。否则它将继续循环并保持旋转。问题是,当我只运行 197 时,我知道每次旋转整数时它都是素数,我最终失败了,因为当我第二次旋转时,我得到了错误的数字。这就是为什么我让它输出 k,只是为了看看为什么会出错。

应该是什么输出:

971, 719, 1

我得到的输出:

971, 1690, 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;
}

【问题讨论】:

  • 您在内部循环中不断添加k。 1690 == 971 + 719
  • 啊!那解决了它。谢谢你,先生。只需设置 k = 0;以上a=h;它解决了这个问题。 (虽然它仍然运行 47 秒,但可能有更有效的方法来做到这一点)。
  • 您可以使用算术来旋转,不需要数字向量。 rotated = n/10 + (n % 10)*pow(10, h-1)
  • 是的,我想有一个更简单的方法。我一周前刚开始学习 C++,所以我想习惯使用向量是一种额外的学习体验。

标签: c++ vector


【解决方案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;
}

【讨论】:

  • 谢谢。我希望我能给你和伊戈尔投票,但我是新来的,我需要 15 个代表。
  • 呃,std::rotate 是据我所知,OP 使用的是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多