C语言求向量和的两则问题解答分享_C 语言

求一个向量的任何连续子向量的最大和

比如向量(31,-41,59,26,-53,58,97,-93,-23,84);
最大和是从59到97即为187

#include<stdio.h>
#include<stdlib.h>

//两者的最大值
int max( int x, int y );
//三者的最大值
int max2( int x, int y, int z );
//最原始的算法,复杂度为T(n)=O(n*n)
int oringinal( int v[], int len );
//原始基础上变体版,复杂度为T(n)=O(n*n)
int oringinal_ex( int v[], int len );
//分治法,复杂度为T(n)=O(n*log(n))
/*
 *分治法的思想是:将原数组分成两部分,要求的最大值
 *要么在左边这部分里面,要么在右边这部分里面
 *要么就在左右相交的交界处
 */
int divAndCon( int v[], int low, int high );
//扫描法,复杂度为T(n)=O(n)
int scan(int v[], int len);

void main()
{
     int i = 0;
     int v[] = {31,-41,59,26,-53,58,97,-93,-23,84};
     int len = 0;
     int result;
     len = sizeof(v) / sizeof(int);
     printf("oringinal datas:\n");
     for( i = 0; i < len; i++ )
     {
       printf("%d\t",v[i]);
     }
     printf("\n");
     //最原始的算法
     result = oringinal(v,len);
     printf("oringinal(v,len):%d\n",result);
     //最原始变体的算法
     result = oringinal_ex(v,len);
     printf("oringinal_ex(v,len):%d\n",result);
     //分治法
     result = divAndCon(v,0,len-1);
     printf("divAndCon(v,0,len):%d\n",result);
     //扫描法
     result = scan(v,len);
     printf("scan(v,len):%d\n",result);
}

//两者的最大值
int max( int x, int y )
{
     if( x < y )
     {
        x = y;
     }
     return x;
}

//三者的最大值
int max2( int x, int y, int z )
{
     if( x < y )
     {
       x = y;
     }
     if( x < z )
     {
       x = z;
     }
     return x;
}

//最原始的算法,复杂度为T(n)=O(n*n)
int oringinal( int v[], int len )
{
     int maxsofar = 0;
     int i;
     int j;
     int sum = 0;
     //通过双层循环逐步扫描,通过max( sum, maxsofar)获得当前最大值
     for( i = 0; i < len; i++ )
     {
       sum = 0;
       for( j = i; j < len; j++ )
       {
         sum += v[j];
         maxsofar = max( sum, maxsofar );
        }
     }
     return maxsofar;
}

//原始基础上变体版,复杂度为T(n)=O(n*n)
int oringinal_ex( int v[], int len )
{
     int i = 0;
     int j = 0;
     int sum = 0;
     int maxsofar = 0;
     int *cumarr = ( int * )malloc( len * sizeof(int) );

    for( i = 0; i < len; i++ )
    {
       if( i == 0 )
       {
         cumarr[0] = v[i];
       }
       else
       {
         cumarr[i] = cumarr[i-1] + v[i];
       }

     }
    for( i = 0; i < len; i++ )
      for( j = i; j < len; j++ )
      {
        if( i == 0 )
        {
           sum = cumarr[i];
         }
         else
        {
           sum = cumarr[j] - cumarr[i-1];
         }
        maxsofar = max(maxsofar,sum);
      }
      return maxsofar;

}

//分治法,复杂度为T(n)=O(n*log(n))
int divAndCon( int v[], int low, int high )
{
    int mid = 0;
    int lmax = 0;
    int rmax = 0;
    int sum = 0;
    int i = 0;

    if( low > high )
    {
      return 0;
    }
    if( low == high )
    {
      return max(0,v[low]);
    }
    mid = ( low + high ) / 2;
    lmax = sum = 0;
    for( i = mid; i >= low; i-- )
    {
       sum += v[i];
       lmax = max(lmax,sum);
    }
    rmax = sum = 0;
    for( i = mid + 1; i <= high; i++ )
    {
      sum +=v[i];
      rmax = max(rmax,sum);
    }
    return max2(lmax + rmax,divAndCon(v,low,mid),divAndCon(v,mid+1,high));

}

//扫描法,复杂度为T(n)=O(n)
int scan(int v[], int len)
{
     int maxsofar = 0;
     int maxendinghere = 0;
     int i = 0;
     for( i =0; i < len; i++ )
     {
       maxendinghere = max(maxendinghere + v[i],0);
       maxsofar = max(maxsofar,maxendinghere);
     }
     return maxsofar;
} 

求一个向量的任何连续最接近0的子向量的和

比如向量(31,-41,59,26,-53,58,97,-93,-23,84);
最大和是从97到-93即为4

#include<stdio.h>
#include<math.h>

//返回最接近0的数
int closeZero( int x, int y );
//最原始的算法,复杂度为T(n)=O(n*n)
int oringinal( int v[], int len );

void main()
{
     int i = 0;
     int v[] = {31,-41,59,26,-53,58,97,-93,-23,84};
     int len = 0;
     int result;
     len = sizeof(v) / sizeof(int);
     printf("oringinal datas:\n");
     for( i = 0; i < len; i++ )
    {
      printf("%d\t",v[i]);
    }
    printf("\n");
    //最原始的算法
    result = oringinal(v,len);
    printf("oringinal(v,len):%d\n",result);

}

//返回最接近0的数
int closeZero( int x, int y )
{
     if( abs(x) > abs(y) )
     {
       x = y;
     }
     return x;
}

//最原始的算法,复杂度为T(n)=O(n*n)
int oringinal( int v[], int len )
{
     int sofar = v[0];
     int i;
     int j;
     int sum = 0;

     for( i = 0; i < len; i++ )
     {
       sum = 0;
       for( j = i; j < len; j++ )
       {
         sum += v[j];
         sofar = closeZero( sum, sofar );
       }
     }
     return sofar;
}

 运行结果:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
, 向量
向量和
平面向量解答题、向量解答题、c语言向量、支持向量机c语言代码、c语言向量运算,以便于您获取更多的相关知识。

时间: 2024-10-26 22:35:26

C语言求向量和的两则问题解答分享_C 语言的相关文章

C++中字符串查找操作的两则实例分享_C 语言

在一个字符串中找到第一个只出现一次的字符题目:     在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 分析:     一个字符串存储的都是ASCII字符,其ASCII范围不超过255.     因此可以再创建一个255个元素的数组存储字符串中字符出现的个数.     通过两次遍历即可求得. 代码实现(GCC编译通过): #include "stdio.h" #include "stdlib.h" //查找字符串中第一个只出现一次

c语言求1+2+...+n的解决方法_C 语言

题目:求1+2+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C). 分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制.但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度.通常求1+2+-+n 除了用公式n(n+1)/2之外,无外乎循环和递归两种思路.由于已经明确限制for和while的使用,循环已经不能再用了.同样,递归函数也需要用if语句或者条件判断语句来判断是继续

使用C语言实现vector动态数组的实例分享_C 语言

下面是做项目时实现的一个动态数组,先后加入了好几个之后的项目,下面晒下代码. 头文件: # ifndef __CVECTOR_H__ # define __CVECTOR_H__ # define MIN_LEN 256 # define CVEFAILED -1 # define CVESUCCESS 0 # define CVEPUSHBACK 1 # define CVEPOPBACK 2 # define CVEINSERT 3 # define CVERM 4 # define EXP

使用VC6.0对C语言程序进行调试的基本手段分享_C 语言

(1)设置固定断点或临时断点 所谓断点,是指定程序中的某一行,让程序运行至该行后暂停运行,使得程序员可以观察分析程序的运行过程中的情况.这些情况一般包括: ①在变量窗口(Varibles)中观察程序中变量的当前值.程序员观察这些值的目的是与预期值对比,若与预期值不一致,则此断点前运行的程序肯定在某个地方有问题,以此可缩小故障范围.例如以下程序是计算cos(x)并显示,运行时发现无论x输入为多少,结果都是0.046414. 复制代码 代码如下: #include <stdio.h>#includ

纯C语言:递归二进制转十进制源码分享_C 语言

复制代码 代码如下: #include<stdio.h>#include<math.h>int change(int n,int *sum,int *m)//n为第n位,m总位数{    char c;    if(c!='#')    {        *m=*m+1;        change(n+1,sum,m);    }    if(c=='#')    {        return *sum=int(*sum+pow(2,*m-n));    }}void main

c语言实现系统时间校正工具代码分享_C 语言

复制代码 代码如下: //*******************************************************************//Time Protocol是一种非常简单的应用层协议.它返回一个未格式化的32位二进制数字, //这个数字描述了从1900年1月1日午夜到现在的秒数.服务器在端口37监听协议请求,以 //TCP/IP或者UDP/IP格式返回响应.将服务器的返回值转化为本地时间是客户端程序的责任. //这里使用的时间服务器是129.132.2.21,更

利用C语言来求最大连续子序列乘积的方法_C 语言

题目描述:给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8.也就是说,上述数组中,3 0.5 8这3个数的乘积3*0.5*8=12是最大的,而且是连续的. 提醒:此最大乘积连续子串与最大乘积子序列不同,请勿混淆,前者子串要求连续,后者子序列不要求连续.也就是说:最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence,LCS)的区别:     

c语言-求把这段汇编改成C语言

问题描述 求把这段汇编改成C语言 NAME MAIN ;演示主程序 MAIN_CODE SEGMENT CODE STACK SEGMENT IDATA RSEG STACK DS 20H ;32 Bytes Stack CSEG AT 0000H ;定位0 LJMP START RSEG MAIN_CODE ;开始程序段 START: MOV SP,#STACK-1 LCALL Infrared_INIT ;红外通讯初始化 MAIN: LCALL Infrared_Test ;调用自收自发红外

r语言-求大神指点,怎样用R语言对同一文件夹里的很多Excel表,EXCEL表又有很多Sheet实现写入操作

问题描述 求大神指点,怎样用R语言对同一文件夹里的很多Excel表,EXCEL表又有很多Sheet实现写入操作 手都断了,试了好多函数,loadWorkbook,openxlsx同时用write.xlsx,addWorksheet--试了一下午,都被这问题搞死了,呜呜~这是出现过的一个错误 解决方案 http://blog.sina.com.cn/s/blog_6e9c33de0101a6ps.html 解决方案二: 可以先读取出来,操作完数据在进行写入啊