求实数的整数次幂(循环版)(高效)(位运算解题)

简介: 说明:参数 x 为底数,n 为指数。若参数正确,则函数值为 x 的 n 次幂。若参数不正确(当底数为 0 且指数为 0 或负数时无意义),则报告错误,函数值为0。// 这个位运算是大部分都不熟悉也不敢用的东西,但是确实是编程里面的一个非常重要的工具。请编写函数,用循环语句以最快的方法求任意实数的任意整数次幂。要求:不得调用 pow 函数,不得使用递归方法。指数 二进制 公式。

求实数的整数次幂(循环版)(高效) (10 分)

原理图
在这里插入图片描述

请编写函数,用循环语句以最快的方法求任意实数的任意整数次幂。
函数原型

double Power(double x, int n);

说明:参数 x 为底数,n 为指数。若参数正确,则函数值为 x 的 n 次幂。若参数不正确(当底数为 0 且指数为 0 或负数时无意义),则报告错误,函数值为0。

提示:
指数 二进制 公式
1 0001 x=x
2 0010 x?2??=x?2??
3 0011 x?3??=x?x?2??
4 0100 x?4??=x?4??
5 0101 x?5??=x?x?4??
6 0110 x?6??=x?2???x?4??
7 0111 x?7??=x?x?2???x?4??
8 1000 x?8??=x?8??
9 1001 x?9??=x?x?8??
10 1010 x?10??=x?2???x?8??
11 1011 x?11??=x?x?2???x?8??
12 1100 x?12??=x?4???x?8??
13 1101 x?13??=x?x?4???x?8??
14 1110 x?14??=x?2???x?4???x?8??
15 1111 x?15??=x?x?2???x?4???x?8??

要求:不得调用 pow 函数,不得使用递归方法。
*/

// 这个位运算是大部分都不熟悉也不敢用的东西,但是确实是编程里面的一个非常重要的工具

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

double Power(double x, int n);

int main()
{
    double x;
    int n;
    scanf("%lg %d", &x, &n);
    printf("%g\n", Power(x, n));
    return 0;
}


// 这个函数的原理就是吧指数转化为二进制,例如15,它的二进制就是1111,把每一个二进制数分开来看就是1000 + 100 + 10 + 1
// 转化为十进制就是8 + 4 + 2 + 1,当然计算的时候这个先后顺序是倒过来的1 + 2 + 4 + 8
// 然后这个循环次数就是4次原来的循环次数是15次,时间复杂度重O(n) 变成了O(log2 n),速度就是大幅度提高了 
double Power(double x, int n)  // 记住一定要double不然int再大都不够
{
    double s = 1.0, p = x;  // 这个s = 1.0必须这么写, 最开始p = x也没什么好说的, 
    int k = n; 
    if(0 == x)     // 这个条件没什么好说的 
    { 
        if(n <= 0)        // 增强代码的健壮性,包含了底数为0的时候,指数小于等于0的情况 
        {
            s = 0.0;
            printf("不正确的参数!\n");
        }
        else
        {
            s = 0.0;
        }
    }
    else if(n > 0)   // 另外两种情况的讨论 
                     // 首先我们要知道一个常识1的补码是00000001,所以和1进行&(与运算) 之后结果就是看最后一位
                     // 原理很简单前面这个数字转化为二进制之后最后一位前面的不论是0还是1都会变成0,之后结果就只
                     // 能看最后一位了,这就是这个题的一个关键 
    {
        while (k)     // 循环k次就是 
        {
            if(k & 1)        // 进行与运行,看看是否s 是不是需要乘以p,例如指数为10,转化为二进制后位1010,可以分解为十进制2 + 8 
                            // 真正运算的时候有两次是条件是成立的, 
            {
                s *= p;
            }
            p *= p;            // 在没有成立的时候p *= p的作用就是让这个p的值满足下一次条件需要的值(不太好解释,feel) 
            k >>= 1;        // 然后右移1位,k的十进制数字/2(取整),二进制数字例如1010变成0101 
         } 
    }
    else if(n < 0)
    {
        s = 1.0 / Power(x, -n);  // 题目说是没有用到递归但是为了争强题目的可读性,和简化代码还是用了点递归 
    }
    return s;
}

运行结果
在这里插入图片描述

相关文章
|
算法 Shell 开发者
【Conan 入门教程 】Conan 2.1中的打印方式/输出管理
【Conan 入门教程 】Conan 2.1中的打印方式/输出管理
247 1
|
数据可视化 Java 分布式数据库
分享111个Java源码,总有一款适合您
分享111个Java源码,总有一款适合您
691 0
|
3月前
|
人工智能 监控 搜索推荐
抖音电商API短视频种草,转化路径缩短70%!
在电商竞争激烈的当下,抖音电商API通过短视频种草功能,将用户购买路径缩短70%,大幅提升转化效率。本文解析其技术原理与实际应用,揭示其如何改变传统电商流程,助力商家抢占市场先机。
343 0
|
3月前
|
人工智能 前端开发 JavaScript
释放Qwen3-Coder潜力:Bolt+AnalyticDB Supabase,打造真正的生产力工具
阿里云发布Qwen3-Coder,具备卓越自主编码能力,支持超长上下文窗口与工具调用,结合Bolt与AnalyticDB Supabase,实现高效开发。
275 2
|
11月前
|
弹性计算 人工智能 数据管理
AI场景下的对象存储OSS数据管理实践
本文介绍了ECS和OSS的操作流程,分为两大部分。第一部分详细讲解了ECS的登录、密码重置、安全组设置及OSSUTIL工具的安装与配置,通过实验创建并管理存储桶,上传下载文件,确保资源及时释放。第二部分则聚焦于OSSFS工具的应用,演示如何将对象存储挂载为磁盘,进行大文件加载与模型训练,强调环境搭建(如Conda环境)及依赖安装步骤,确保实验结束后正确清理AccessKey和相关资源。整个过程注重操作细节与安全性,帮助用户高效利用云资源完成实验任务。
995 161
|
7月前
|
机器学习/深度学习 数据可视化 机器人
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
扩散模型和流匹配是生成高分辨率数据(如图像和机器人轨迹)的先进技术。扩散模型通过逐步去噪生成数据,其代表应用Stable Diffusion已扩展至机器人学领域形成“扩散策略”。流匹配作为更通用的方法,通过学习时间依赖的速度场将噪声转化为目标分布,适用于图像生成和机器人轨迹生成,且通常以较少资源实现更快生成。 本文深入解析流匹配在图像生成中的应用,核心思想是将图像视为随机变量的实现,并通过速度场将源分布转换为目标分布。文中提供了一维模型训练实例,展示了如何用神经网络学习速度场,以及使用最大均值差异(MMD)改进训练效果。与扩散模型相比,流匹配结构简单,资源需求低,适合多模态分布生成。
557 13
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
|
10月前
|
人工智能 自然语言处理 安全
千行百业,“义”不容辞:通义技术创新与商业实践
千行百业,“义”不容辞:通义技术创新与商业实践。本次分享分为两部分,首先介绍大模型的快速迭代与普及,探讨通义千问在精度和复杂任务执行上的突破;其次聚焦企业级落地,解决安全性、部署路径及模型调优三大问题。通过多模态理解(视觉、语音)和更强的生成控制力,携手伙伴服务各行业,推动技术向生产力转化,并关注公益应用,助力社会进步。
|
机器学习/深度学习 人工智能 搜索推荐
AI与未来医疗:革命性的技术,重塑健康产业
在21世纪的科技浪潮中,人工智能(AI)正迅速成为医疗领域的关键力量。本文探讨了AI在未来医疗中的潜力和应用前景,从智能诊断、个性化治疗到药物研发和患者护理,详细阐述了AI如何通过提升效率、准确性和个性化医疗服务来重塑健康产业。通过案例分析和专家观点,本文展示了AI在医疗领域的多重影响,并讨论了其面临的伦理和隐私挑战。
|
自然语言处理 前端开发 数据可视化
Quarto ppt模板制作与Rstudio git连接
本文介绍了当前PPT演示中流行的Quarto文档使用情况,以及如何在Rstudio中连接Git进行版本控制。重点讲解了Quarto的ppt模板制作流程,包括安装、创建演示文稿及自定义样式等步骤,并提供了相关资源链接。
363 0
Quarto ppt模板制作与Rstudio git连接