文档章节

公式推导的算法之取数位

C
 C狸扣豆
发布于 2014/04/23 16:19
字数 639
阅读 205
收藏 3

给定一个整数取要求取前面n位数字,如893243,取前面4位,即8932。

给出两个一个普通算法,一个取对数算法。

普通算法:因为取前面4位,如果小于10000直接输出,如果大于10000,则判断10,000<NUMBER<100,000,如果符合就直接        除以10即可,如果不符合继续判断100,000<NUMBER<1,000,000可以用math.h

    double pow( double x, double y );

    循环判断即可。

取对数算法:log10(893243) = log10(8.93243*10^5) = log10(8.93243)+5;

    因为 0 < log10(8.93243) < 1 ,所以log10(8.93243)必是log10(893243)的小数部分;

    log10(8.93243) = X

    10^X = 8.93243,

    问题变成:

    1.如何让一个数变成一个首位带小数点的数?(以便我乘1000得到四位的数)

    2.又如何得到小数部分?(以便我

    整理一下,给定一个NUMBER

    log10(NUMBER) = Y.X

    Y.X - Y = X

    10^X = N.UMBER    首位紧跟带小数点的数

    然后用NUMBER&times;1000或者10000等,来取的想要的几位数字。

其实log10()本身就由这个特点,如果大于100那么就是2.xx如果大于1000就是3.xxx只不过这个小数部分是和这个数的“首位后带小数点的数”联系,换句话说就是知道了小数部分,整体信息就知道了,而且由小数->原数信息的格式是固定的,就是首位后带小数点。然后去处理这个格式固定的就可以了。

下面是假定n为4

#include<stdio.h>
#include<math.h>
#include<sys/time.h>
int main()
{
    struct timeval tv_begin, tv_end;
    int num,i,k,temp;
    float z;
    printf("input number:");
    scanf("%d",&num);
    k = 4;
    temp = num;
    gettimeofday(&tv_begin, NULL);/*用以测量运行时间*/
    for(;num>9999;){            
        if(pow(10,k) <= num && pow(10,k+1) > num){
            num = num/(int)pow(10,k-3);
            break;
        }
        k++;
    }
    gettimeofday(&tv_end, NULL);
    printf("way of repetition  %d\n",num);
    printf("time %d s %d us\n",tv_end.tv_sec - tv_begin.tv_sec,tv_end.tv_usec - tv_begin.tv_usec);
    //使用log取对数方式取前面n位值
    gettimeofday(&tv_begin, NULL);
    z = log10(temp);                //对于小于1000的,做个判断即可
    z = z - floor(z);
    num = pow(10,z)*1000;
    gettimeofday(&tv_end, NULL);
    printf("way of log %d\n",num);
    printf("time %d s %d us\n",tv_end.tv_sec - tv_begin.tv_sec,tv_end.tv_usec - tv_begin.tv_usec);
    return 0;
}

    里面使用linux的sys/time.h用以测量两者之间的效率差,附:

    double floor(double);如floor(123.34)为123.00,就是舍去小数部分

    int gettimeofday(struct timeval*tv, struct timezone *tz);

struct timeval{
    long int tv_sec; // 秒数
    long int tv_usec; // 微秒数
}

    比clock(void)函数精准些,到微妙。再精准可能需要使用rdtsc指令到时钟周期。

© 著作权归作者所有

C
粉丝 0
博文 24
码字总数 9890
作品 0
马鞍山
私信 提问
当我们谈论收敛速度时,我们都在谈什么?

今天我们聊一聊收敛速度,看别人论文的时候,他们总会说我们的算法是sublinear convergence, 我们的算法是linear convergence的, 我们的算法是 quadratic convergence。。。看的我云里雾里,...

未名
2017/07/02
0
0
【图像缩放】双立方(三次)卷积插值

前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 其中效果最好的是,本文介绍它的原理以及使用 如果想先看效果和源码,可以拉到最底部 本文的契机是某...

撒网要见鱼
2017/11/02
0
0
优化算法——拟牛顿法之BFGS算法

一、BFGS算法简介 BFGS算法是使用较多的一种拟牛顿方法,是由Broyden,Fletcher,Goldfarb,Shanno四个人分别提出的,故称为BFGS校正。 同DFP校正的推导公式一样,DFP校正见博文“优化算法—...

google19890102
2015/05/20
0
0
【图像缩放】双立方(三次)卷积插值

前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 其中效果最好的是,本文介绍它的原理以及使用 如果想先看效果和源码,可以拉到最底部 本文的契机是某...

dailc
02/18
0
0
【图像缩放】双立方(三次)卷积插值

前言 图像处理中有三种常用的插值算法: 最邻近插值 双线性插值 双立方(三次卷积)插值 其中效果最好的是,本文介绍它的原理以及使用 如果想先看效果和源码,可以拉到最底部 本文的契机是某...

撒网要见鱼
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
今天
3
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
5
0
Python机器学习之数据探索可视化库yellowbrick

背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维。陆续使用过plotly、seaborn,...

yeayee
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部