【问题标题】:error: static_assert failed due to requirement '!is_signed<int>::value' "" static_assert((!is_signed<_Tp>::value), ""); [duplicate]错误:由于要求 '!is_signed<int>::value' "" static_assert((!is_signed<_Tp>::value), ""); [复制]
【发布时间】:2021-03-31 23:43:18
【问题描述】:

注意:在此处请求的函数模板特化 'std::__1::__gcd' 的实例化 而 (__gcd(n, k)

上面的行与前面显示的错误一起显示,我知道还有很多其他方法可以计算 gcd,但我很困惑为什么它不适用于 (__gcd() )。

我正在使用 MacBook:操作系统 -> BgSur

                  Apple clang version 12.0.0 (clang-1200.0.32.29)
#include <bits/stdc++.h>
#include <cmath>
using namespace std;

int getSum(int n)
{
    int sum;
    for (sum = 0; n > 0; sum += n % 10, n /= 10)
        ;
    return sum;
}
int main() {
    int t, n;
    cin >> t;
    while (t--) {
        cin >> n;
        int k = getSum(n);
        while (__gcd(n, k) <= 1) n++;
        cout << n << endl;
    }
}

这里,getSum(125) = 1+2+5 = 8

输入:

3
11
31
75

输出:

12
32
75

预期输出:

12
33
75

【问题讨论】:

  • 请通过editing问题将您的确切输入和预期输出添加到问题中。
  • 另外,这不是错误信息。这是一条为您提供有关错误的更多上下文的行。编辑问题时,请包含编译器的完整输出。
  • @Sneftel 这两个是编译器显示的唯一行
  • @UnholySheep 不,实际上不是
  • @Ted-Lyngmo 完成!

标签: c++ clang


【解决方案1】:

正如静态断言所暗示的,您的 __gcd() 实现需要无符号类型的参数(即算法仅对非负数进行操作),因此将 int 替换为 unsigned int 应该会有所帮助 - 或者您可以替换

#include <bits/stdc++.h>  // never include this
#include <cmath>

#include <iostream>
#include <numeric>  // std::gcd

并改用标准库中包含的 GCD 函数:

while (std::gcd(n, k) <= 1) n++;

【讨论】:

  • 谢谢,它帮助了我,但现在在第二个测试用例中,即 31,我收到 32,但正确答案是 33
  • @trev if 33 预计您的算法或算法的实现中有一些错误。如果它与 GCD 函数本身有关,我会感到惊讶。
  • 如果我们提供的输入是正数(无符号),那么我们为什么要关心数据类型是什么?请解释一下。
  • @Ted-Lyngmo “如果它与 GCD 函数本身有关,我会感到惊讶”为什么?
  • @Ted-Lyngmo 好的,谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2021-03-29
  • 2012-08-20
  • 1970-01-01
  • 2019-10-29
  • 1970-01-01
  • 2014-06-20
相关资源
最近更新 更多