c++ - 判断一个数是否具有 P^Q 形式?

标签 c++ c algorithm

我最近出现了在线编码测试。我突然想到一个问题,即

给定一个数N,判断上面的数是否为P^Q(P幂Q)形式。我使用蛮力方法(满足个体数)完成了这个问题,但这导致超时。所以我需要高效的算法。

输入:9

输出:是

输入:125

输出:是

输入:27

输出:是

约束:2

最佳答案

如果我们假设非平凡的情况,那么约束将是这样的:

  • N = <2,100000)
  • P>1
  • Q>1

这可以通过标记所有幂大于结果的 1 的筛子来解决。现在的问题是您需要优化单个查询还是多个查询?如果您只需要单个查询,那么您不需要内存中的筛表,您只需迭代直到命中 N 然后停止(因此在最坏的情况下,当 N 不是 N 形式时,这将计算整个筛)。否则,初始化这样的表一次,然后就可以使用它。由于 P^Q 很小,所以我选择完整的表格。

const int n=100000;
int sieve[n]={255}; // for simplicity 1 int/number but it is waste of space can use 1 bit per number instead
int powers(int x)
    {
    // init sieve table if not already inited
    if (sieve[0]==255)
        {
        int i,p;
        for (i=0;i<n;i++) sieve[i]=0;   // clear sieve
        for (p=sqrt(n);p>1;p--)         // process all non trivial P
         for (i=p*p;i<n;i*=p)           // go through whole table
          sieve[i]=p;                   // store P so it can be easily found later (if use 1bit/number then just set the bit instead)
        }
    return sieve[x];
    }
  • 第一个调用在我的设置中使用了 N,其他调用是不可测量的小时间
  • 它返回0.548 ms,因此如果P,则数字采用P!=0形式,因此您可以直接将其用作P^Q,并且您也可以通过除法轻松获得bool,或者如果需要,您可以使用Q创建另一个筛子,速度更快还有 Q

这里发现了所有重要的权力 P,Q

 4 = 2^q
 8 = 2^q
 9 = 3^q
 16 = 2^q
 25 = 5^q
 27 = 3^q
 32 = 2^q
 36 = 6^q
 49 = 7^q
 64 = 2^q
 81 = 3^q
 100 = 10^q
 121 = 11^q
 125 = 5^q
 128 = 2^q
 144 = 12^q
 169 = 13^q
 196 = 14^q
 216 = 6^q
 225 = 15^q
 243 = 3^q
 256 = 2^q
 289 = 17^q
 324 = 18^q
 343 = 7^q
 361 = 19^q
 400 = 20^q
 441 = 21^q
 484 = 22^q
 512 = 2^q
 529 = 23^q
 576 = 24^q
 625 = 5^q
 676 = 26^q
 729 = 3^q
 784 = 28^q
 841 = 29^q
 900 = 30^q
 961 = 31^q
 1000 = 10^q
 1024 = 2^q
 1089 = 33^q
 1156 = 34^q
 1225 = 35^q
 1296 = 6^q
 1331 = 11^q
 1369 = 37^q
 1444 = 38^q
 1521 = 39^q
 1600 = 40^q
 1681 = 41^q
 1728 = 12^q
 1764 = 42^q
 1849 = 43^q
 1936 = 44^q
 2025 = 45^q
 2048 = 2^q
 2116 = 46^q
 2187 = 3^q
 2197 = 13^q
 2209 = 47^q
 2304 = 48^q
 2401 = 7^q
 2500 = 50^q
 2601 = 51^q
 2704 = 52^q
 2744 = 14^q
 2809 = 53^q
 2916 = 54^q
 3025 = 55^q
 3125 = 5^q
 3136 = 56^q
 3249 = 57^q
 3364 = 58^q
 3375 = 15^q
 3481 = 59^q
 3600 = 60^q
 3721 = 61^q
 3844 = 62^q
 3969 = 63^q
 4096 = 2^q
 4225 = 65^q
 4356 = 66^q
 4489 = 67^q
 4624 = 68^q
 4761 = 69^q
 4900 = 70^q
 4913 = 17^q
 5041 = 71^q
 5184 = 72^q
 5329 = 73^q
 5476 = 74^q
 5625 = 75^q
 5776 = 76^q
 5832 = 18^q
 5929 = 77^q
 6084 = 78^q
 6241 = 79^q
 6400 = 80^q
 6561 = 3^q
 6724 = 82^q
 6859 = 19^q
 6889 = 83^q
 7056 = 84^q
 7225 = 85^q
 7396 = 86^q
 7569 = 87^q
 7744 = 88^q
 7776 = 6^q
 7921 = 89^q
 8000 = 20^q
 8100 = 90^q
 8192 = 2^q
 8281 = 91^q
 8464 = 92^q
 8649 = 93^q
 8836 = 94^q
 9025 = 95^q
 9216 = 96^q
 9261 = 21^q
 9409 = 97^q
 9604 = 98^q
 9801 = 99^q
 10000 = 10^q
 10201 = 101^q
 10404 = 102^q
 10609 = 103^q
 10648 = 22^q
 10816 = 104^q
 11025 = 105^q
 11236 = 106^q
 11449 = 107^q
 11664 = 108^q
 11881 = 109^q
 12100 = 110^q
 12167 = 23^q
 12321 = 111^q
 12544 = 112^q
 12769 = 113^q
 12996 = 114^q
 13225 = 115^q
 13456 = 116^q
 13689 = 117^q
 13824 = 24^q
 13924 = 118^q
 14161 = 119^q
 14400 = 120^q
 14641 = 11^q
 14884 = 122^q
 15129 = 123^q
 15376 = 124^q
 15625 = 5^q
 15876 = 126^q
 16129 = 127^q
 16384 = 2^q
 16641 = 129^q
 16807 = 7^q
 16900 = 130^q
 17161 = 131^q
 17424 = 132^q
 17576 = 26^q
 17689 = 133^q
 17956 = 134^q
 18225 = 135^q
 18496 = 136^q
 18769 = 137^q
 19044 = 138^q
 19321 = 139^q
 19600 = 140^q
 19683 = 3^q
 19881 = 141^q
 20164 = 142^q
 20449 = 143^q
 20736 = 12^q
 21025 = 145^q
 21316 = 146^q
 21609 = 147^q
 21904 = 148^q
 21952 = 28^q
 22201 = 149^q
 22500 = 150^q
 22801 = 151^q
 23104 = 152^q
 23409 = 153^q
 23716 = 154^q
 24025 = 155^q
 24336 = 156^q
 24389 = 29^q
 24649 = 157^q
 24964 = 158^q
 25281 = 159^q
 25600 = 160^q
 25921 = 161^q
 26244 = 162^q
 26569 = 163^q
 26896 = 164^q
 27000 = 30^q
 27225 = 165^q
 27556 = 166^q
 27889 = 167^q
 28224 = 168^q
 28561 = 13^q
 28900 = 170^q
 29241 = 171^q
 29584 = 172^q
 29791 = 31^q
 29929 = 173^q
 30276 = 174^q
 30625 = 175^q
 30976 = 176^q
 31329 = 177^q
 31684 = 178^q
 32041 = 179^q
 32400 = 180^q
 32761 = 181^q
 32768 = 2^q
 33124 = 182^q
 33489 = 183^q
 33856 = 184^q
 34225 = 185^q
 34596 = 186^q
 34969 = 187^q
 35344 = 188^q
 35721 = 189^q
 35937 = 33^q
 36100 = 190^q
 36481 = 191^q
 36864 = 192^q
 37249 = 193^q
 37636 = 194^q
 38025 = 195^q
 38416 = 14^q
 38809 = 197^q
 39204 = 198^q
 39304 = 34^q
 39601 = 199^q
 40000 = 200^q
 40401 = 201^q
 40804 = 202^q
 41209 = 203^q
 41616 = 204^q
 42025 = 205^q
 42436 = 206^q
 42849 = 207^q
 42875 = 35^q
 43264 = 208^q
 43681 = 209^q
 44100 = 210^q
 44521 = 211^q
 44944 = 212^q
 45369 = 213^q
 45796 = 214^q
 46225 = 215^q
 46656 = 6^q
 47089 = 217^q
 47524 = 218^q
 47961 = 219^q
 48400 = 220^q
 48841 = 221^q
 49284 = 222^q
 49729 = 223^q
 50176 = 224^q
 50625 = 15^q
 50653 = 37^q
 51076 = 226^q
 51529 = 227^q
 51984 = 228^q
 52441 = 229^q
 52900 = 230^q
 53361 = 231^q
 53824 = 232^q
 54289 = 233^q
 54756 = 234^q
 54872 = 38^q
 55225 = 235^q
 55696 = 236^q
 56169 = 237^q
 56644 = 238^q
 57121 = 239^q
 57600 = 240^q
 58081 = 241^q
 58564 = 242^q
 59049 = 3^q
 59319 = 39^q
 59536 = 244^q
 60025 = 245^q
 60516 = 246^q
 61009 = 247^q
 61504 = 248^q
 62001 = 249^q
 62500 = 250^q
 63001 = 251^q
 63504 = 252^q
 64000 = 40^q
 64009 = 253^q
 64516 = 254^q
 65025 = 255^q
 65536 = 2^q
 66049 = 257^q
 66564 = 258^q
 67081 = 259^q
 67600 = 260^q
 68121 = 261^q
 68644 = 262^q
 68921 = 41^q
 69169 = 263^q
 69696 = 264^q
 70225 = 265^q
 70756 = 266^q
 71289 = 267^q
 71824 = 268^q
 72361 = 269^q
 72900 = 270^q
 73441 = 271^q
 73984 = 272^q
 74088 = 42^q
 74529 = 273^q
 75076 = 274^q
 75625 = 275^q
 76176 = 276^q
 76729 = 277^q
 77284 = 278^q
 77841 = 279^q
 78125 = 5^q
 78400 = 280^q
 78961 = 281^q
 79507 = 43^q
 79524 = 282^q
 80089 = 283^q
 80656 = 284^q
 81225 = 285^q
 81796 = 286^q
 82369 = 287^q
 82944 = 288^q
 83521 = 17^q
 84100 = 290^q
 84681 = 291^q
 85184 = 44^q
 85264 = 292^q
 85849 = 293^q
 86436 = 294^q
 87025 = 295^q
 87616 = 296^q
 88209 = 297^q
 88804 = 298^q
 89401 = 299^q
 90000 = 300^q
 90601 = 301^q
 91125 = 45^q
 91204 = 302^q
 91809 = 303^q
 92416 = 304^q
 93025 = 305^q
 93636 = 306^q
 94249 = 307^q
 94864 = 308^q
 95481 = 309^q
 96100 = 310^q
 96721 = 311^q
 97336 = 46^q
 97344 = 312^q
 97969 = 313^q
 98596 = 314^q
 99225 = 315^q
 99856 = 316^q
  • 它使用了 N<100000 ,包括第一次 init 调用(以及字符串输出到备忘录,这比计算本身慢得多),而没有只使用 62.6 ms 的字符串

关于c++ - 判断一个数是否具有 P^Q 形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33066757/

相关文章:

c++ - 正则表达式替换为 c++11 中的回调?

c++ - std::optional 是否更改函数的签名?

c - 如何将文件指针移动到文本文件中的下一个单词?

c - 我需要在嵌入式系统中以十六进制形式打印可变数量的字符以进行调试

c - 程序接受负数,即使我有代码可以防止这种情况

algorithm - 我应该使用什么类型的算法?

c++ - 如何更改 C++ 输出流以引用 cout?

c++ - 如何在连接所有客户端套接字的情况下关闭boost asio服务器套接字

c - 不使用多个数组的 C 快速排序实现

c++ - 从 2D 网格上的点向外遍历的好算法是什么?