c++ - 从列表迭代器中取消引用指向 long 数组的指针
问题描述
如何正确取消引用指向long
.
在函数中,main
我的代码似乎打印了地址而不是长值。
#include <list>
#include <iostream>
#include <cmath>
#include <vector>
bool
is_prime (long i)
{
// fix wrong return values for 0 and 1
if (i <= 1)
return false;
const long j = (long) std::sqrt(i);
for (long k=2; k<j+1; ++k) {
if (i % k == 0)
return false;
}
return true;
}
std::list<long(*)[2]>
goldbach (long number)
{
std::list<long(*)[2]> sums;
std::list<long(*)[2]>::iterator it;
if (number < 4) // Exclude too small integers.
return sums;
if (number % 2) // Exclude uneven numbers.
return sums;
it = sums.begin();
for (long candidate=2; candidate < number; ++candidate)
{
if (is_prime(candidate))
{
if (is_prime(number - candidate))
{
long sum[2];
sum[0] = candidate;
sum[1] = number - candidate;
std::cout << sum[0] << " + " << sum[1] << "\n";
sums.insert(it, &sum);
++it;
}
}
}
return sums;
}
int
main ()
{
std::list<long(*)[2]> sums;
std::list<long(*)[2]>::iterator it;
for(long i = 4; i < 100; i+=2)
{
std::cout << "### " << i << " ###" << "\n";
sums = goldbach(i);
for (it = sums.begin(); it != sums.end(); ++it)
{
long num1 = *((*it)[0]);
long num2 = *((*it)[1]);
std::cout << num1 << " + " << num2 << "\n";
}
std::cout << "\n\n";
}
}
解决方案
感谢评论,我意识到列表中的数组在 C++ 中是个坏主意。
我将代码更改为以下内容,该代码有效:
#include <list>
#include <iostream>
#include <cmath>
#include <vector>
bool
is_prime (long i)
{
// fix wrong return values for 0 and 1
if (i <= 1)
return false;
const long j = (long) std::sqrt(i);
for (long k=2; k<j+1; ++k) {
if (i % k == 0)
return false;
}
return true;
}
std::list<std::pair<long, long>>
goldbach (long number)
{
std::list<std::pair<long, long>> sums;
std::list<std::pair<long, long>>::iterator it;
if (number < 4) // Exclude too small integers.
return sums;
if (number % 2) // Exclude uneven numbers.
return sums;
it = sums.begin();
long complement;
for (long candidate=2; candidate < number; ++candidate)
{
if (is_prime(candidate))
{
complement = number - candidate;
if (is_prime(complement))
{
std::pair<long, long> sum = std::make_pair(candidate, complement);
sums.insert(it, sum);
++it;
}
}
}
return sums;
}
int
main ()
{
std::list<std::pair<long, long>> sums;
std::list<std::pair<long, long>>::iterator it;
for(long i = 4; i < 100; i+=2)
{
std::cout << "### " << i << " ###" << "\n";
sums = goldbach(i);
for (it = sums.begin(); it != sums.end(); ++it)
{
std::cout << it->first << " + " << it->second << "\n";
}
std::cout << "\n\n";
}
}
推荐阅读
- r - 将 data.frame 从宽重塑为长,从变量组中创建多列
- sql - 将属性从一个表迁移到另一个表
- php - Symfony 缓存在构造函数中传递类名(字符串)而不是实例(Doctrine ODM)
- javascript - Nodemailing 使用变量发送带有 Javascript Discord 机器人的电子邮件
- java - ECDSA KeyPairGenerator 不可用(但在 JUnit 中有效)
- sql - 动态百分位查找
- javascript - javascript - 更改文本时输入类型=收音机消失
- firebase - 从 firebase onchange 返回 observable
- bash - ftp脚本上传整个目录
- php - 在 CAKEPHP 中获取 .ctp 文件的 html