精华内容
下载资源
问答
  • 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为r的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,...这是一很浪费时间方法,每次都删除第m个数字(注意题意包含摸的概念),也

    已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为r的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。求最后出列的人的编号。

    第一种方法就是使用循环链表的方法,因为这种方法在删除一个节点后,对于其他节点的位置改动不用太大。这是一种很浪费时间的方法,每次都删除第m个数字(注意题意包含摸的概念),也就是说,每次删除,都要用O(m)的时间,一共有n个数字,想要剩下一个,其余都要删除,那么就得用(n-1)*O(m)的时间,故算法的时间复杂度为O(mn).下面贴上两种代码的实现,分别为c和c++,之后给出另一种时间复杂度的算法。

    c:

    #include<stdio.h>
    #include<stdlib.h>
    typedef struct node{
    	int data;
    	struct node *next;
    }LinkNode, *LinkList;
    LinkNode* get_last_num(int n, int k, int m) {
    	LinkList head = NULL;
    	LinkNode *temp = NULL;
    	LinkNode *p = NULL;
    	int i;
    	for(i=1; i <= n; i++) {//create list
    		p = (LinkNode*)malloc(sizeof(LinkNode));
    		p->data = i;
    		p->next = NULL;
    
    
    		if(head == NULL) {
    			head = p;
    		} else {
    			temp->next = p;
    		}
    		temp = p;
    	}
    	// link from last node to first node to a circle
    	p->next = head; 
    	p= head;
    	// move k-1 step to k
    	i = 1;
    	while(i < k) {
    		p = p->next;
    		i++;
    	}
    	while(p->next != p) {
    		for(i = 1; i < (m-1); i++){ // move to node before destinated one
    			p = p->next;
    		}
    		temp = p->next; // get the aimed one
    		printf("%d\t", temp->data);
    		p->next = temp->next;
    		p = p->next; // point to node next deleted p node
    		free(temp);
    		temp = NULL;
    	}
    	return p;
    }
    void main() {
    	LinkNode *result = get_last_num(9, 1, 5);
    	printf("%d\t", result->data);
    	free(result);
    }

    c++:

    #include<iostream>
    #include<list>
    using namespace std;
    int get_last_num(int n, int k, int m) {
    	list<int> ilist;
    	for(size_t i = 1; i != (n+1); i++)
    		ilist.push_back(i);
    	list<int>::iterator it = ilist.begin();
    	for(i = 1; i < k; i++)
    		++it;
    	while(ilist.size() > 1) {
    		for(i = 1; i < m; i++) {
    			if(it == ilist.end())
    				it = ilist.begin();
    			++it;
    		}
    		if(it == ilist.end())
    			it = ilist.begin();
    		cout << *it << endl;
    		it = ilist.erase(it);
    		if(it == ilist.end())
    			it = ilist.begin();
    	}
    	return *it;
    }
    void main() {
    	int result = get_last_num(9, 1, 5);
    	cout << result << endl;
    }

    第二种时间复杂度的算法,要涉及到一些数学知识。假设给定的数列为1,2,3,...,n-1,n的形式,从第1人开始报数到m,假设每次报数到m的人的编号为m,然后这个人出列。剩下的人的编号分别是m+1,m+2,...n-1,n,1,2,...,m-1.设定数列1,2,3,...,n-1,n根据约瑟夫规则剩下的数字为与m,n有关的方程式:f(n,m),设定 f'(n-1,m)为数列m+1,m+2,...n-1,n,1,2,...,m-1根绝约瑟夫规则最后剩下的数字。可以看出,f(n,m),f'(m,n)表示的最后数字对应的序列式不一样的,第一个是以升序排列,而第二个是先升序,后降序。可以根映射将在序列二种的数字转化为对应序列一种的形式,

    m+1    ->    1
    m+2    ->    2

    n-1    ->    n-m-1
    0       ->    n-m

    m-1    ->   n-1

    转换方程式为p(x)=(x + n - m) % n,x属于序列二,逆向的转换方式为 p'(x) = (x + m) % n,其中x属于第一种序列。 f'(n-1,m)表示的第二个序列的最后一个数和序列一经过 p'(x)转后序列的最后一个数字相同。 f'(n-1,m) = [f(n-1,m) + m] % n。

            0                  n=1
    f(n,m)={
                   [f(n-1,m)+m]%n     n>1

    注意,这个方程式是一个递归的形式。

    #include<iostream>
    #include<list>
    using namespace std;
    int get_last_num(int n, int m){
    	int last_num = 0;
    	for(int i = 2; i <= n; i++)
    		last_num = (last_num + m) % i;
    	return last_num;
    }
    void main() {
    	int result = get_last_num(9, 5);
    	cout << result << endl;
    }
    上述只是给出了从第一个开始数的情况,从第k个开始数的情况还在分析,自己也有点混沌。如果有高人,请指教。
    展开全文
  • IP地址有两种表示方法:整数和点分十进制` 从下面的例子可以看出,整数1945097072和115.239.211.112表示的是同一个地址 C:\Users\helloworld>ping 1945097072 正在 Ping 115.239.211.112 具有 32 字节的数据: 来自 ...

    IP地址有两种表示方法:整数和点分十进制`

    从下面的例子可以看出,整数1945097072和115.239.211.112表示的是同一个地址


    那么二者之间是如何转化的呢?


    1. 整数到点分十进制
    1945097072的十六进制表示是73 EF D3 70,每个字节转换成十进制表示就是115.239.211.112


    2.点分十进制到整数

    115.239.211.112每部分准换成16进制是73 EF D3 70,转换成十进制就是1945097072。

    展开全文
  • 使用gmtime函数或localtime函数将time_t类型的时间日期转换为struct tm类型: 使用time函数返回的是一个long值,该值对用户的意义不大,一般不能根据其值确定具体的年、月、日等数据。gmtime函数可以方便的对time...

         使用gmtime函数或localtime函数将time_t类型的时间日期转换为struct tm类型:

    使用time函数返回的是一个long值,该值对用户的意义不大,一般不能根据其值确定具体的年、月、日等数据。gmtime函数可以方便的对time_t类型数据进行转换,将其转换为tm结构的数据方便数据阅读。

    gmtime函数的原型如下:

    struct tm *gmtime(time_t *timep);

    localtime函数的原型如下:

    struct tm *localtime(time_t *timep);

    将参数timep所指的time_t类型信息转换成实际所使用的时间日期表示方法,将结果返回到结构tm结构类型的变量。

    gmtime函数用来存放实际日期时间的结构变量是静态分配的,每次调用gmtime函数都将重写该结构变量。如果希望保存结构变量中的内容,必须将其复制到tm结构的另一个变量中。

    gmtime函数与localtime函数的区别:

    gmtime函数返回的时间日期未经时区转换,是UTC时间(又称为世界时间,即格林尼治时间)

    localtime函数返回当前时区的时间,

    转换日期时间表示形式time_t类型转换为struct tm类型示例:

    #include <stdio.h>

    #include <time.h>

    int main()

    {

        char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};/*指针字符数组*/

        time_t t;

        struct tm *p;

        t=time(NULL);/*获取从197011日零时到现在的秒数,保存到变量t*/

        p=gmtime(&t); /*变量t的值转换为实际日期时间的表示格式*/

       printf("%d%02d%02d",(1900+p->tm_year), (1+p->tm_mon),p->tm_mday);

        printf(" %s ", wday[p->tm_wday]);

    printf("%02d:%02d:%02d\n", p->tm_hour, p->tm_min, p->tm_sec);

        return 0;

    }

     

    注意:p=gmtime(&t);此行若改为p=localtime(&t);则返回当前时区的时间




         使用mktime函数将struct tm类型的时间日期转换为time_t类型:

    表头文件

    #include <time.h>

    定义函数

    time_t mktime(strcut tm * timeptr);

    函数说明

    mktime()用来将参数timeptr所指的tm结构数据转换成从公元197011000 秒算起至今的UTC时间所经过的秒数。

    返回值

    返回经过的秒数。

     

    日期转换为秒数示例:

    #include <stdio.h>

    #include <time.h>

    int main()

    {

        time_t t;

        struct tm stm;

        printf("请输入日期时间值(yyyy/mm/dd hh:mm:ss格式)");

        scanf("%d/%d/%d %d:%d:%d",&stm.tm_year,&stm.tm_mon,&stm.tm_mday,

            &stm.tm_hour,&stm.tm_min,&stm.tm_sec);

    stm.tm_year   -=  1900; /*年份值减去1900,得到tm结构中保存的年份序数*/

    stm.tm_mon    -=  1;    /*月份值减去1,得到tm结构中保存的月份序数*/

    t=mktime(&stm);  /* 若用户输入的日期时间有误,则函数返回值为-1*/

    if(-1==t)

    {

            printf("输入的日期时间格式出错!\n");

            exit(1);

    }

    printf("1970/01/01 00:00:00~%d/%02d/%02d %02d:%02d:%02d%d\n",

        stm.tm_year+1900,stm.tm_mon,stm.tm_mday,

            stm.tm_hour,stm.tm_min,stm.tm_sec,t);

        return 0;

    }
    展开全文
  • 由于Android系统源码的默认时间为1970年,本文提供两种方法来修改Android的默认时间, 一、启动服务脚本来修改默认时间二、修改系统源码来解决默认时间

    转载注明网址:http://blog.csdn.net/hubbybob1/article/details/54575572
    前段时间在做Openssl的相关编程,发现一个错误:

    error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:s3_pkt.c:1259:SSL alert number 42
    /*42:bad_certificate
    There is a problem with the certificate, for example, a certificate is corrupt, or a certificate contains signatures that cannot be verified.*/

    表示出现SSL错误码为42,经过查找列出了相关的错误码为bad_certificate,即CA证书出错,经过排查发现我的CA证书的时间是2016年制作,而我的Android平台系统时间却是1970年,所以会报错,那么就要修改Android平台的默认时间。
    由于Android系统源码的默认时间为1970年,本文提供两种方法来修改Android的默认时间。
    由于Android系统源码的默认时间为1970年,本文提供两种方法来修改Android的默认时间。
    一、启动服务脚本来修改默认时间
    修改系统时间的命令就是:

    date -s //设置当前时间,只有root权限才能设置,其他只能查看 
    date -s 20170117//设置系统时间为2017年1月17日00:00:00
    date -s 01:01:01 //设置具体时间,不会对日期做更改 
    date -s "01:01:01 2017-01-17" //这样可以设置全部时间 
    date -s "01:01:01 20170117" //这样可以设置全部时间 
    date -s "2017-01-17 01:01:01" //这样可以设置全部时间 
    date -s "20120117 01:01:01" //这样可以设置全部时间

    1.编写脚本文件,随便命名为setdate.sh如下:

    #!/system/bin/sh
    su
    date -s 20170117
    date -s 12:00:00
    echo "*******************************"
    echo "set date 2017.01.17 12:00:00"
    echo "*******************************"

    把编写好的shell脚本放到固定的目录下面,例如可以放到和init.rc同一个目录下。
    2.编写MK文件,找到你的启动mk文件,再起末尾添加如下copy语句:

    PRODUCT_COPY_FILES += 相对本mk文件的存放脚本的路径/setdate.sh:system/bin/setdate.sh
    //在运行过程中将setdate.sh脚本copy到/system/bin/下面

    3.编写init.rc启动服务文件
    在其最后添加以下内容,用来启动这个服务

    service tiny /system/bin/setdate.sh
    class main
    oneshot
    on property:sys.boot_completed=1
    start setdate 

    到这里重新编译你的Android源码,安装就可以在启动系统的时候,使用date命令对系统的时间进行修改,其实这个不算严格意义上的修改默认的时间,下面的方法就是去Android源码里面去修改具体的时间了。
    二、修改系统源码来解决默认时间
    在这里主要讨论的是从Android系统源码出发来对系统时间的修改。其文件要找到是在

    /frameworks/base/services/java/com/android/server/SystemServer.java 

    在这个文件中的第1180行的代码如下:

    //在对象public class SystemServer内如下定义和判断
        static Timer timer;//定义时间
        static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr,一小时的毫秒数
    //从970年1月一日0点0分0秒开始所经过的毫秒数
        // The earliest supported time.  We pick one day into 1970, to
        // give any timezone code room without going into negative time.
        private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000;//可以查时间的ms数为1970的某天,定义最近时间
    
        /**
         * Called to initialize native system services.
         */
        private static native void nativeInit();
    
        public static void main(String[] args) {
    
            /*
             * In case the runtime switched since last boot (such as when
             * the old runtime was removed in an OTA), set the system
             * property so that it is in sync. We can't do this in
             * libnativehelper's JniInvocation::Init code where we already
             * had to fallback to a different runtime because it is
             * running as root and we need to be the system user to set
             * the property. http://b/11463182
             */
            SystemProperties.set("persist.sys.dalvik.vm.lib",
                                 VMRuntime.getRuntime().vmLibrary());
    
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {//获取当前时间和所设置的最近时间进行对比,,一般都是网络获取,没有网路的话一般都是1970年开始,可理解为没有互联网就设置为最近时间
                // If a device's clock is before 1970 (before 0), a lot of
                // APIs crash dealing with negative numbers, notably
                // java.io.File#setLastModified, so instead we fake it and
                // hope that time from cell towers or NTP fixes it
                // shortly.
                Slog.w(TAG, "System clock is before 1970; setting to 1970.");
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);//设置为定义的最近时间,也就是默认时间
            }

    因此我们可以修改这个最近时间,也就是默认时间如下:

    //private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000;//可以查时间的ms数为1970的某天,
    //private static final long EARLIEST_SUPPORTED_TIME = 1477899065689L;//设置时间为20140701
    private static final long EARLIEST_SUPPORTED_TIME = 1482899065689L;//设置时间为2017年的某一天,某一时刻

    到这里修改时间的两种方法已经完毕,是不是很简单啊

    展开全文
  • Python time strftime() 函数接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定。 语法 strftime()方法语法: time.strftime(format[, t]) 参数 format – 格式字符串。 t – 可选的参数t是...
  • session缓存时间两种设置方式

    千次阅读 2015-10-03 23:06:54
    设置session失效时间的2种方法,setMaxInactiveInterval和session-config的不同 第一:在web.xml中的session-config配置 session-timeout元素(WEB.XML文件中的元素)用来指定默认的会话超时时间间隔,以...
  • 大O表示法时间复杂度

    千次阅读 2020-07-15 15:21:57
    学数据结构和算法的目的 =>实现程序的高速运行,那么必然要了解复杂度。 复杂度分为两个维度:时间、空间。 度量一个程序的执行时间通常有两种方法 ...大O表示法——四种时间复杂度 1. Ο(1):...
  • C/C++中计算函数运行时间两种方法

    万次阅读 多人点赞 2017-11-04 23:30:11
    方法就是在该段代码或者函数前面,记录一个时间T1,在代码段或函数后面记录时间T2,那其运行时间就是T2-T1,下面看看具体运算方法方法一:  clock()是C/C++中的计时函数,而与其相关的数据类型是clock_t; ...
  • Python time strftime() 函数接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定。 语法 strftime()方法语法: time.strftime(format[, t]) 参数 format – 格式字符串。 t – 可选的...
  • C++中两种常用的记录程序运行时间方法的总结

    万次阅读 多人点赞 2016-05-13 13:13:24
    本篇博客对C++中常用的记录程序运行时间方法进行简单的总结。
  • 其中使用cpu计算的总次数的数量级,就以时间复杂度来标识(因为往往运算的次数和时间是成正比的,次数多,使用的时间就多),符号为大写O。 时间复杂度的定义 一般情况下,算法中基本操作重复执
  • 1.双亲表示法: 假设以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置,其形式说明如下: 例如,图6.13展示一棵树及其双亲表示的存储结构。 这种存储结构利用了每个结点...
  • 设置session超时时间两种方法

    千次阅读 2007-05-31 13:59:00
    1 可以在web.xml中进行配置: 30 此时值的单位为分钟,2以编程方式进行设置: 使用HttpSession 的setMaxInactiveInterval(int sec )进行session 超时时间的设置此时值的单位为秒, 也可以查看超时时间:调用...
  • 原先的知识没好好学,导致现在很多都忘了,或者说以前就没弄懂过。现在重新看一遍,收获良多,不管怎样先写这篇基础的,当做笔记。 图的定义:是由顶点的有穷非空集合...无向图:顶点之间的边是没有方向的,也就是
  • 图的几种表示方法

    万次阅读 多人点赞 2016-06-22 11:20:13
    如果网络比较稀疏,这种表示法浪费大量的存储空间,从而增加了在网络中查找弧的时间。  同样,对于网络中的权,也可以用类似邻接矩阵的 矩阵表示。只是此时一条弧所对应的元素不再是1,而是相应的权而已。如
  • 卫星定位授时系统的时间表示主要有以下几方法: 1、通用时间表示方法: 日历表示法:年、月、日、时、分、秒 2、儒略日(JULIAN DAY):是指从-4712年1月1日(即公元前4713年1月1日)正午开始的天数。 由J.J....
  • 树的几种表示法

    万次阅读 2012-12-18 15:15:49
    1、双亲表示法 双亲表示法声明如下: typedef int TPosition; //结点的位置类型为整型 struct NodeType  ElemType data ; //该结点的数据  TPosition Parent; //该结点的父亲的数组下标,对于根...
  • 例题: 一个3阶低通滤波器由下面差分方程描述: y(n) = 0.0181 x(n) + 0.0543 x(n-1) + 0.0543 x(n-2) + 0.0181 x(n-3) + 1.76 y(n-1) - 1.1829 y(n-2) + 0.2781...第一种方法是博文里给出的: 【 MATLAB 】用 MA...
  • 描述流体运动的两种方法 空间点不同时刻由不同质点占据 所以空间点的物理量是占据该点的物理量 拉格朗日方法: 四台摄像机 欧拉方法: 对整个空间连续拍照 拉格朗日自变量是初始位置 同时和时间有关 可建立位置...
  • 算法的时间复杂度(大O表示法

    千次阅读 2020-10-31 16:44:50
    下面我们来看下两种简单的方法方法有很多种),再来引入算法的运行时间!`` 方法一(循环遍历): 假设你从1开始依次往上猜,猜测过程会是这样! 这是简单查找,更准确的说法是傻找。每次猜测都只能排除一个数字。...
  • 【Matlab】两种灰度归一化方法

    万次阅读 2018-12-17 17:02:05
    在许多图像处理系统中,灰度归一化是必备的预处理过程。...这里介绍两种灰度归一化的方法:均值方差归一化、灰度变换归一化。 1. 均值方差归一化[1] 均值方差归一化是将不同时间、不同光照下采集到...
  • Matlab用三格式来表示日期与时间

    万次阅读 2017-03-19 15:39:34
    Matlab用三格式来表示日期与时间 转自http://www.360doc.com/content/14/1206/16/16363452_430844776.shtml (1)双精度型日期数字:一个日期型数字代表从公元0年到某一日期的的天数,例如,2008年8月26日夜时0...
  • 二进制的几编码表示方法

    千次阅读 2013-09-16 17:06:05
    二进制的几编码表示方法。  计算机存储数据信息都是以二进制编码存储的,机器内存储的数据的表达形式称为“机器数”,而它代表的数制称为这个机器数的“真值”。数有正负之分,那么在计算机里怎么表示正负呢,...
  • 树的存储结构一、双亲表示法 一、双亲表示法 实现:定义数组结构存放树的结点,每个结点含个域: 数据域:存放结点本身数据信息。 双亲域:指示本结点的双亲结点在数组中的位置。 结点结构表示为: ...
  • linux 下对CPU压测的两种方法

    万次阅读 2017-12-29 19:42:07
    下面介绍两种对CPU进行压测的方法:第一种:bc计算圆周率 [root@server51 ~]# echo "scale=5000; 4*a(1)" | bc -l -q表示计算圆周率达到小数点后面的5000位。第二种:Super PI 计算圆周率小数点后n位所需要的时间 ...
  • Linux下两种删除过期文件的方法详述

    千次阅读 2015-07-29 11:25:17
    在实际的C软件开发项目中,不同的软件会在不同的目录中生成文件,由于磁盘的存储...一般说来,有两种删除过期文件的方法,一种是在C程序中实现,一种是利用crontab实现。本文对这两种方法的具体实现进行详细的介绍。
  • 创建.NET缓存cache的两种方法

    千次阅读 2018-05-13 18:34:07
    创建.NET缓存cache的两种方法亮术网 2013-06-07 本网原创 在程序开发过程中,适当使用 Cache 缓存能有效提高程序执行效率。比如一些常常调用的系统公共变量,把它们缓存到 Cache 中,当需要使用它们时,直接从 ...
  • 谈谈大O表示法

    万次阅读 2019-05-03 10:20:42
    故在正式介绍大O表示法之前,我们先来看看算法优劣的个指标:“时间复杂度”与“空间复杂度”。 一、时间复杂度 时间复杂度是指一个算法被执行所需要的计算工作量。它用来度量算法执行的时间长短。 ...
  • 数据库连接超时java处理的两种方法

    千次阅读 2018-08-15 17:09:38
    前言:在测试一套数据库是否能够连接上的过程中,我们就会遇到这样的一种情况,当不能连接的时候会存在代码运行时间超级长的问题,这样的话在页面上会存在卡死的现象,为了解决这个问题,总结了下面两种方式: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,343,257
精华内容 537,302
关键字:

两种时间表示方法