c 语言 朴素算法与分治算法计算X^n

朴素算法:不详细讲了,就是先算x乘x,算完结果在乘x,直到n个x相乘

分治算法(看图比较方便)

如图:算法先将X^n分开,分到不能再分为止(分的时候是调用自身函数),程序运行时也是如此,当不能再分时开始和从下往上和,例如3^6,先算sum=3*3*3,再算sum=sum*sum(即sum=3^3*3^3)

c 语言 朴素算法与分治算法计算X^n

朴素算法与分治算法计算X^n的算法比较

#include<stdio.h>

#include<stdlib.h>//strand,rand函数头文件

#include<time.h>//clock函数头文件

doubleputong(int x,int n)//普通方法计算X^n

{

    double time;//运行时间

    clock_t beg,end;//起始时间,结束时间

    beg=clock();                //普通方法起始时间

    long long he=1;//存储结果

    int i;

    for(i=1;i<=n;i++) //循环计算结果

    {

        he=he*x;

    }  

    end=clock();//普通方法结束时间

    time=(double)(end-beg) / CLOCKS_PER_SEC; //普通方法运行时间

    printf("%lld\n",he);

    return time;

}

longlong erfen(int x, int n)//二分(分治)计算X^n

{      

    long long he;//存储结果

    if(n==1)

        return (long long)x;//结束自身循环或n为1

    else if(n > 1)

    {

        long long s;

        int m=n/2;//分段

        s=erfen(x,m);//调用本身函数(递归)

        if(n%2==0)//n为偶次

        {

            he=s*s;//进行分段计算

            return he;

        }

        else

        {

            he=s*s*x;//进行分段计算

            return he;//n为奇次

        }

    }

}

intmain()

{

    int x,n;

    double time;//运行时间

    printf("输入X的值:");

    scanf("%d",&x);

    printf("输入n的值:");

    scanf("%d",&n);

    clock_t beg,end;//起始时间和结束时间

    printf("普通算法运行时间为%f\n",putong(x,n));

    beg=clock();//二分(分治)起始时间

    long long sum=erfen(x,n);

    end=clock();//二分(分治)结束时间

    time=(double)(end- beg) / CLOCKS_PER_SEC;// //二分(分治)运行时间

    printf("二分算法运行时间为%f\n",time);

    return 0;

c 语言 朴素算法与分治算法计算X^n

c 语言 朴素算法与分治算法计算X^n