c语言 数组-请教如何用c语言去除一个数组中所有值为零的元素,而且这些零元素中有连续排列的?

问题描述

请教如何用c语言去除一个数组中所有值为零的元素,而且这些零元素中有连续排列的?

能否给一个示例程序?感激不尽!
比如以下这个数组中有连续的0元素,如何去除所有的零元素?
double a[64]={4.63866e+020,1.456e+027,-7.67487e+017,9.86481e+016,0,0,-3.1101e+014,-9.38282e+010,
1.456e+027,4.60249e+033,-2.3969e+024,3.36857e+023,0,0,-9.64264e+020,-2.93898e+017,
-7.67487e+017,-2.3969e+024,1.27445e+015,-1.52231e+014,0,0,5.19276e+011,1.55469e+008,
9.86481e+016,3.36857e+023,-1.52231e+014,1.02833e+014,0,0,-4.00459e+010,-2.01495e+007,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
-3.1101e+014,-9.64264e+020,5.19276e+011,-4.00459e+010,0,0,2.17304e+008,62943,
-9.38282e+010,-2.93898e+017,1.55469e+008,-2.01495e+007,0,0,62943,19};

解决方案

 // ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <math.h>

int trimzero(double arr[], int len)
{
    int x = 0;
    for (int i = 0; i < len; i++)
    {
        if (arr[i] == 0.0) continue;
        arr[x] = arr[i];
        x++;
    }
    return x;
}

int _tmain(int argc, _TCHAR* argv[])
{
    double a[64] = { 4.63866e+020, 1.456e+027, -7.67487e+017, 9.86481e+016, 0, 0, -3.1101e+014, -9.38282e+010,
        1.456e+027, 4.60249e+033, -2.3969e+024, 3.36857e+023, 0, 0, -9.64264e+020, -2.93898e+017,
        -7.67487e+017, -2.3969e+024, 1.27445e+015, -1.52231e+014, 0, 0, 5.19276e+011, 1.55469e+008,
        9.86481e+016, 3.36857e+023, -1.52231e+014, 1.02833e+014, 0, 0, -4.00459e+010, -2.01495e+007,
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0,
        -3.1101e+014, -9.64264e+020, 5.19276e+011, -4.00459e+010, 0, 0, 2.17304e+008, 62943,
        -9.38282e+010, -2.93898e+017, 1.55469e+008, -2.01495e+007, 0, 0, 62943, 19 };
    int n = trimzero(a, 64);
    for (int i = 0; i < n; i++)
    {
        printf_s("%fn", a[i]);
    }
    return 0;
}

463866000000000000000.000000
1456000000000000000000000000.000000
-767487000000000000.000000
98648100000000000.000000
-311010000000000.000000
-93828200000.000000
1456000000000000000000000000.000000
4602490000000000100000000000000000.000000
-2396900000000000000000000.000000
336857000000000000000000.000000
-964264000000000000000.000000
-293898000000000000.000000
-767487000000000000.000000
-2396900000000000000000000.000000
1274450000000000.000000
-152231000000000.000000
519276000000.000000
155469000.000000
98648100000000000.000000
336857000000000000000000.000000
-152231000000000.000000
102833000000000.000000
-40045900000.000000
-20149500.000000
-311010000000000.000000
-964264000000000000000.000000
519276000000.000000
-40045900000.000000
217304000.000000
62943.000000
-93828200000.000000
-293898000000000000.000000
155469000.000000
-20149500.000000
62943.000000
19.000000
Press any key to continue . . .
确保顺序但是效率略低的算法

解决方案二:

 // ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <math.h>

int trimzero(double arr[], int len)
{
    int last = len;
    while (arr[--last] == 0.0 && last >= 0);
    for (int i = 0; i < last; i++)
    {
        if (arr[i] == 0.0)
        {
            arr[i] = arr[last];
            while (arr[--last] == 0.0 && last >= 0);
        }
    }
    return last;
}

int _tmain(int argc, _TCHAR* argv[])
{
    double a[64] = { 4.63866e+020, 1.456e+027, -7.67487e+017, 9.86481e+016, 0, 0, -3.1101e+014, -9.38282e+010,
        1.456e+027, 4.60249e+033, -2.3969e+024, 3.36857e+023, 0, 0, -9.64264e+020, -2.93898e+017,
        -7.67487e+017, -2.3969e+024, 1.27445e+015, -1.52231e+014, 0, 0, 5.19276e+011, 1.55469e+008,
        9.86481e+016, 3.36857e+023, -1.52231e+014, 1.02833e+014, 0, 0, -4.00459e+010, -2.01495e+007,
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0,
        -3.1101e+014, -9.64264e+020, 5.19276e+011, -4.00459e+010, 0, 0, 2.17304e+008, 62943,
        -9.38282e+010, -2.93898e+017, 1.55469e+008, -2.01495e+007, 0, 0, 62943, 19 };
    int n = trimzero(a, 64);
    for (int i = 0; i < n; i++)
    {
        printf_s("%fn", a[i]);
    }
    return 0;
}

解决方案三:

int del_zero(double p[], int n)
{
int i = 0, j = 0, len = n;

while (i < len){
    if (p[i] != 0.0)
        p[j++] = p[i];
    i++;
}

return j;

}

解决方案四:

 // ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <math.h>

int trimzero(double arr[], int len)
{
    int last = len;
    while (arr[--last] == 0.0 && last >= 0);
    for (int i = 0; i < last; i++)
    {
        if (arr[i] == 0.0)
        {
            arr[i] = arr[last];
            while (arr[--last] == 0.0 && last >= 0);
        }
    }
    return last + 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    double a[64] = { 4.63866e+020, 1.456e+027, -7.67487e+017, 9.86481e+016, 0, 0, -3.1101e+014, -9.38282e+010,
        1.456e+027, 4.60249e+033, -2.3969e+024, 3.36857e+023, 0, 0, -9.64264e+020, -2.93898e+017,
        -7.67487e+017, -2.3969e+024, 1.27445e+015, -1.52231e+014, 0, 0, 5.19276e+011, 1.55469e+008,
        9.86481e+016, 3.36857e+023, -1.52231e+014, 1.02833e+014, 0, 0, -4.00459e+010, -2.01495e+007,
        0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0,
        -3.1101e+014, -9.64264e+020, 5.19276e+011, -4.00459e+010, 0, 0, 2.17304e+008, 62943,
        -9.38282e+010, -2.93898e+017, 1.55469e+008, -2.01495e+007, 0, 0, 62943, 19 };
    int n = trimzero(a, 64);
    for (int i = 0; i < n; i++)
    {
        printf_s("%fn", a[i]);
    }
    return 0;
}

463866000000000000000.000000
1456000000000000000000000000.000000
-767487000000000000.000000
98648100000000000.000000
19.000000
62943.000000
-311010000000000.000000
-93828200000.000000
1456000000000000000000000000.000000
4602490000000000100000000000000000.000000
-2396900000000000000000000.000000
336857000000000000000000.000000
-20149500.000000
155469000.000000
-964264000000000000000.000000
-293898000000000000.000000
-767487000000000000.000000
-2396900000000000000000000.000000
1274450000000000.000000
-152231000000000.000000
-293898000000000000.000000
-93828200000.000000
519276000000.000000
155469000.000000
98648100000000000.000000
336857000000000000000000.000000
-152231000000000.000000
102833000000000.000000
62943.000000
217304000.000000
-40045900000.000000
-20149500.000000
-40045900000.000000
519276000000.000000
-964264000000000000000.000000
-311010000000000.000000
Press any key to continue . . .

解决方案五:

int del_zero(double p[],int n)
{
int i;
int j;
int len=n;

for(i=0;i<len;i++)
{
    if(p[i]>=-DBL_EPSILON||p[i]<=DBL_EPSILON)
    {
        for(j=i;j<len;j++)
        {
            p[j]=p[j+1];
        }
        len--;
    }
}
return len;

}

我试过了 ok

解决方案六:

int del_zero(double p[],int n)
{
int i,j,len=n;
for(i=0;i<len;i++){
if(p[i]==0.0){

for(j=i;j<len;j++){
p[j]=p[j+1];
}
len--;
}
}
return len;
}
这种方法不能去除连0,求大神帮忙,给多少分都行!

解决方案七:

楼上的这个方法可行,运行结果也正确!

解决方案八:

int del_zero(double p[], int n)
{
int i = 0, j, len = n;

while (i < len){
    if (p[i] == 0.0){
        for (j = i; j < len; j++){
            p[j] = p[j + 1];
        }
        len--;
    }
    else
        i++;
}

return len;

}

已修改,测试OK

解决方案九:

这是优化连续为0时效率的改进版。

int del_zero(double p[], int n)
{
int i = 0, j, k, len = n;

while (i < len){
    if (p[i] == 0.0){
        j = 1;
        while (i + j < len){
            if (p[i + j] == 0.0)
                ++j;
            else
                break;
        }
        for (k = i; k < len; k++){
            p[k] = p[k + j];
        }

        len -= j;
    }
    else
        ++i;
}

return len;

}

解决方案十:

如果还需要优化性能可以写在评论里。。

时间: 2024-10-25 10:34:24

c语言 数组-请教如何用c语言去除一个数组中所有值为零的元素,而且这些零元素中有连续排列的?的相关文章

struts2 0-JSP中如何遍历一个字符串数组并取出字符串加在另一个标签中

问题描述 JSP中如何遍历一个字符串数组并取出字符串加在另一个标签中 删除/s:a /s:iterator 解决方案 /c:set 我这里只去取了第一个.不过道理是一样的. 解决方案二: 这个文本编辑器把我的代码给编辑了 <s::set var="img" value="${fn:split(items.images, ',')}"></s:set> <a href="minisetweb/productinfo?id=${i

JAVA_数组_泛型:我写了一个数组结合泛型的通用求和方法,求帮忙优化,写的太烂了

问题描述 JAVA_数组_泛型:我写了一个数组结合泛型的通用求和方法,求帮忙优化,写的太烂了 =====<求求大神帮我优化下啊,我写的太烂了>==== public static void main(String[] args) { Number[] num1 = {2, 3, 3, 4, 5}; //Integer Number[] num2 = {1.1, 2.0, 3.0, 4.0, 5.0}; //Double System.out.println(num1[0].getClass()

class-java注解中一个参数是数组类型,为什么我可以指定一个数组元素而非数组为值

问题描述 java注解中一个参数是数组类型,为什么我可以指定一个数组元素而非数组为值 比如说@Target()这个注解,它的value是一个ElementType[]类型,为什么可以这样写: @Target(ElementType.METHOD) 这样类型可以匹配上吗?这不相当于把一个元素赋给了一个数组? 解决方案 对这个相当于申请了一个数组长度为一的数组,然后放置你的这个唯一值: 当多个的时候,就需要用数组符号{}限制了. 可以自定义一个这样的注解,然后练习获取试试

c语言 c++-【如何用C语言或C++做窗口程序】

问题描述 [如何用C语言或C++做窗口程序] 不知道问这个问题会不会让大神笑话,但是小白还是希望大神能够提供帮助,大家都是从小白过来的,希望见谅! 解决方案 MFC呀,,,如果你喜欢的话,引入window头文件也可以

c语言-编程以行读取txt文件,每行中以tab为分隔符为元素,C+、C#、python均可

问题描述 编程以行读取txt文件,每行中以tab为分隔符为元素,C+.C#.python均可 aaa bbb ccc ddd111 2015-01-01 00:00:00 1.000000002 FFF222 2015-01-02 00:00:01 1.000000003 EEEtxt文件的形式大概是这样,第一行为表头,接着是根据时间顺序排列的记录.元素形式有整型.双精度型.字符串和时间.我希望能够逐行读取记录,并且能够对指定列的元素进行不同记录条(行)间的大小比较(整型的元素)操作并将结果记录

请教如何用异步的方法下载一个文件(图片)呢?附源代码

问题描述 大家好!小弟不才,不知如何做异步文件(图片)下载?如下的代码是用来做异步html页面请求的,请大家看能否改为异步文件下载,并写入到文件中?请高手出招啊,高分相送!PrivateSubMenuItem9_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMenuItem9.ClickDimAsyncResultAsIAsyncResultDimRequestAsWebRequestDimrsAsRequest

基于c语言知识点的补遗介绍_C 语言

使用C很长时间,但是很难说对c的各个点都十分的透彻.虽然c不像c++那样复杂,但是还有很多叽里旮旯儿:并不是他们有多难,而是在于他们平时用的不多,或者和人的第一直觉相悖,再或者初学时经验有限理解不深根本没有记住.下面的这些东西可能来自<c专家编程>或者网络.最近发现基础的经典的书籍常读常新,原因可能有两个:1.随着自己经验的增长,你的认识可能会不一样,思维的方式也会有所变化,而得到的东西自然会是新的东西.2.早些时候经验有限,有些点可能根本就没有完全理解.现在你可以理解的更深刻.这方面的书籍再

ios-给nsdictionary的key添加一个数组

问题描述 给nsdictionary的key添加一个数组 想给nsdictionary的key添加一个数组,其中每个key都是一个question,每个question对应多个answer: Question1 = [Answer1], [Answer2] , [Answer3]; Question2 = [Answer1], [Answer2] , [Answer3]; 然后我尝试用下面的代码时报错: No Visible @interface for NSDictionary declare

代码-用递归能实现一个数组划分的算法么?

问题描述 用递归能实现一个数组划分的算法么? 用递归能实现一个数组划分的算法么? 给一个数组,长度为m,划分成n个子数组(每个数组起码有一个元素),比如 {1 2 3 4 5}划分成2个: 1, 2345 12,345 123,45 1234,5一共5个分法 {1234}分成3个 1,2,34 1,23,4 12,3,4,一共3个分法 求代码怎么写 解决方案 IEnumerable<IEnumerable<IEnumerable<int>>> Split(IEnumer