如何从一个数组中提取零并将非零部分保存到另一个数组?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从一个数组中提取零并将非零部分保存到另一个数组?相关的知识,希望对你有一定的参考价值。
我正在研究关于素数的小程序。例如,我有一个素数数组:
array[15]={0,0,0,13,0,17,0,31,7,3,0,0,0,37,0};
我需要从数组中提取零,然后我需要将剩余的数字保存到另一个数组(对于这种情况,这是tmp)。
我为此操作生成了以下函数。
对于以下代码段:
counter是数组中的素数(在这种情况下为6)。
dB是数组的大小(在这种情况下为15)。
void function2(int array[],int counter){
int tmp[counter];
//takes arrayB with zeros in it, extract zeros prints new array.
for(int a=0;a<counter;a++){
for(int i=0;i<dB;i++){
if(array[i]!=0 ){
tmp[a]=array[i];
break;
}
}
}
cout<<"Prime numbers array extracted from above:\n";
for(int b=0;b<counter;b++){
cout<<tmp[b]<<" ";
}
}
当我执行这个代码时,它只打印第一个素数数组(13)用于计数器时间(6)。
13,13,13,13,13,13
但是,我需要以下输出。
13,17,31,7,3,27
我认为我的算法错了我怎么能解决它的想法呢?
谢谢!
当我改变if语句时:
if(array[i]!=0 && array[a-1]!=array[i])
我得到以下输出
13,17,13,17,13,17
我是否需要对所有6个元素进行更改?
答案
方法很简单,只需迭代包含0和素数的原始数组,一旦得到非零数,就将它添加到tmp数组中。
以下是您重构的代码以执行上述方法:
void function2(int array[],int counter){
int tmp[counter],a=0;
for(int i=0;i<dB;i++){
if(array[i]!=0 ){
tmp[a++]=array[i];
}
}
cout<<"Prime numbers array extracted from above:\n";
for(int b=0;b<counter;b++){
cout<<tmp[b]<<" ";
}
}
另一答案
首先,只做一个循环并遍历所有数组'array'。当值不为零时,将其添加到结果中并递增计数器。当你的计数器等于dB时,使用break指令退出循环。
其次,每次尝试添加新的素数时,都会从数组的开始处开始,删除您找到的上一个素数,这样您就可以不断添加数组中可用的第一个素数。
另一答案
这是一个解决方案:它循环遍历数组,如果元素不是0,则将其插入到vector
中。
#include <iostream>
#include <vector>
using namespace std;
int foo[15]={0,0,0,13,0,17,0,31,7,3,0,0,0,37,0};
void GetPrimesFromArray(int inputArray[], int array_size) {
vector<int> tmp;
for(int i = 0; i < array_size; ++i)
if(inputArray[i]!=0)
tmp.push_back(inputArray[i]);
for(int i = 0; i < tmp.size(); ++i)
cout << tmp[i] << endl;
}
int main() {
GetPrimesFromArray(foo, 15);
}
输出:
13
17
31
7
3
37
以上是关于如何从一个数组中提取零并将非零部分保存到另一个数组?的主要内容,如果未能解决你的问题,请参考以下文章
将给定数组中的所有零移动到末尾,并将每个非零元素替换为最接近的较大值(如果有)