算法--大数开方

2023-11-10

       之前已找到比较好的大数乘法算法,现在我们来解决大数开方问题,如有大数n,求其开方x,则x与n必满足x*x=n;也就是说我们能遍历x找到n的开方,但是问题在于我们是不可能对大数遍历的。如果我们可以确定它的大致范围,仅仅测试几个不容易直接判断的数据就找到目标数据就好了。

     1-一个n位数的开方的位数m满足下列条件:

         m=n/2(n为偶数);

         m=n/2+1(n为奇数);

         以此我们可以确定大数开方的位数,然后判断最高位:

         设一个数为abcd,那么它的开方设ef,将e从0~9遍历,如果当e=x时,xf^2<abcd<(x+1)f^2,即可确定x为ef的最高位,然后将f从0~9遍历,当得到xy^2<abcd<x(y+1)^2时,即可确定y为其次高位,同理可算出其它位数更多的大数开方

     2-1中表达式xf^2<abcd<(x+1)f^2xy^2<abcd<x(y+1)^2是大数比较,这是比较简单的问题,把他们每位都放入数组中,从最高位开始比较,一旦有一个位有大小关系即可相应判断大小,另外保存相等数位的数量以判断是否相等,一旦相等现有数据就是其开方不需再循环遍历求其它数位的数值。

     下面贴上代码:(此代码因用于解决某题目需要,功能为输入两个大数,并将它们的开方输出,但上诉方法都体现在函数模块中)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<sstream>
#include <cstdlib>
using namespace std;

void assignment(int* s,int n){//数组初始化为0
	for(int i=0;i<n;i++){
		s[i]=0;
	}
} 
void Multiplication(char *arr1,char* arr2,int* Result){ //大数乘法
	int n,m;n=strlen(arr1);m=strlen(arr2);
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			Result[i+j]=Result[i+j]+(arr1[i]-'0')*(arr2[j]-'0');
		}
	}
}
int reorganize(int *Result,int n){//将大数乘法的结果整理得到最终的十进制形式
	int k,z=0,t=0,p=0;
	for(int i=0;i<n;i++){
		if(Result[i]>9){
			t=Result[i]%10;
			Result[i+1]=Result[i+1]+Result[i]/10;
			Result[i]=t;  			
		}
	}
	k=n;
	while(k--){
		if(Result[k]!=0){
			z=1;
		}
		if(z==1){
			p++;
		}
	}
	return p;
}
int Comparison(int *Result,int *Root,int n){//大数比较
	int k=0,s=n;
	for(int i=n-1;i>=0;i--){
		if(Result[i]<Root[i])return 1;
		else if(Result[i]>Root[i])return 0;
		else if(Result[i]==Root[i])k++;
		if(k==s)return -1;
	}
	return 0;
}
int getsqrt(char *arr,int *Result,int *Root,int z,int n){//大数开方	 
	int t;
	for(int i=z-1;i>=0;i--){
		for(int j=0;j<10;j++){
			arr[i]=j+'0';
			assignment(Root,n);
			Multiplication(arr,arr,Root);
			if(Root[n-1]<=9)reorganize(Root,n);t=Comparison(Result,Root,n);	
			if(t==1){

				arr[i]=j+'0'-1;
				break;
			}
			if(t==-1){
				arr[i]=j+'0';
				return 0;
			}

		}			
	}
	return 0;	
}
int main(){
	string s1,s2;
	int n,m,z1,z2;char h;
	cin>>s1>>s2;//以输入字串的方式输入数据,方便动态为数据分配空间
	n=s1.length();m=s2.length();
	int *ar1=new int[n+1];int *ar2=new int[m+1];          
	z1=n%2==0?n/2:n/2+1;z2=m%2==0?m/2:m/2+1; //确定方根的位数          
	char *arr1=new char[z1+1];char *arr2=new char[z2+1];
	arr1[z1]='\0';arr2[z2]='\0';                   
	int *Root1=new int[n+1];int *Root2=new int[m+1];int *Root=new int[z1+z2];
	int i=n-1,j=m-1;
	stringstream ss1(s1);while(ss1>>h)ar1[i--]=h-'0';ar1[n]=0;
//将输入字符数据转化为整型数据
	stringstream ss2(s2);while(ss2>>h)ar2[j--]=h-'0';ar2[m]=0;
	memset(arr1,'0',z1);memset(arr2,'0',z2);
	assignment(Root,z1+z2);	
	getsqrt(arr1,ar1,Root1,z1,n+1);
	getsqrt(arr2,ar2,Root2,z2,m+1);	
        return 0;		
} 


      

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法--大数开方 的相关文章

  • Mysql 时间转换 && 时间函数

    1 时间转换 涉及的函数 DATE FORMAT date format MySQL日期格式化函数 STR TO DATE str format MySQL字符串格式化为日期 UNIX TIMESTAMP MySQL其他数据转换为时间戳 F

随机推荐

  • Vue的antd多选下拉框增加全选操作

    因为antd的多选下拉框没有提供全选操作 我做了一个简易的全选操作 data return categoryList 存放获取到的分选数据 category 已选分类数据
  • QT信号槽的5种连接方式

    在面试中 这是一个经常被问到的问题点 也是刚刚上qt的工程师不会去注意的一个点 qt源代码定义的连接方式如下 1 Qt AutoConnection 一般信号槽不会写第五个参数 其实使用的默认值 使用这个值则连接类型会在信号发送时决定 如果
  • markdown编辑数学公式

    在输入数学公式的时候 需要在数学公式的前后加入 符号 将需要输入的公式加入到 中间 上下标 上标 下标 名称 数学表达式 markdown公式 上标 ab a b a b 下标 ab a b a b 分数 frac 第一个 写分子 第二个
  • React Native(RN)-组件生命周期

    生命周期简介 像 Android 开发一样 React Native RN 中的组件也有生命周期 Lifecycle 借用大神流程图 这张图很简洁直观地告诉我们 生命周期的整个流程以及阶段划分 第一阶段 getDefaultProps gt
  • 目标检测入门

    目录 R CNN 1 1提取候选区域 1 1 1合并规则 1 1 2多样化与后处理 1 2特征提取 1 2 1预处理 2 Fast RCNN 2 1RoI Pooling Layer Faster RCNN 结构 RPN anchor 目标
  • Junit中使用线程池不执行任务代码

    1 在test中使用线程池发送MQ 没有报错 没有执行线程池中的代码 2 查资料 junit框架只要主线程结束完成 单元测试就会关闭 导致线程池中的线程没有执行代码就被销毁关闭了 可以在主线程中sleep一段时间 或者用main方法
  • 稳定ORACLE的执行计划

    很多时候可能我们都希望CBO能够帮我们生成正确 高效的执行计划 但是很多时候事实并非如此 可能因为各种各样的原因 如 统计信息不正确或者CBO天生的缺陷等 都会导致生成的执行计划特别的低效 之前的一家公司有一台专门用于批量做数据校验清洗的数
  • 大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

    大学四年 看课本是不可能一直看课本的了 对于学习 特别是自学 善于搜索网上的一些资源来辅助 还是非常有必要的 下面我就把这几年私藏的各种资源 网站贡献出来给你们 主要有 电子书搜索 实用工具 在线视频学习网站 非视频学习网站 软件下载 面试
  • 'vue-cli-service' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    vue时 报 vue cli service 不是内部或外部命令 也不是可运行的程序 或批处理文件 罪该万死 怎么能忘记 npm install 如果你下载的淘宝镜像 也可以cnpm install 转载于 https www cnblog
  • Java设计模式-状态模式

    1 概述 定义 对有状态的对象 把复杂的 判断逻辑 提取到不同的状态对象中 允许状态对象在其内部状态发生改变时改变其行为 例 通过按钮来控制一个电梯的状态 一个电梯有开门状态 关门状态 停止状态 运行状态 每一种状态改变 都有可能要根据其他
  • STM32F031串口(RS485)中断+DMA发送(预备知识)

    STM32F031串口 RS485 中断 DMA发送 前言 GPIO移植过程 与F1系列的一些区别 串口 DMA 前言 最近在搞STM32F031的项目 F0系列与常用的F1系列有一定区别 在开发过程中遇到一些问题 而且花了好长花间在搜寻解
  • js操作剪贴板讲解

    文章目录 复制 剪切 到剪贴板 Document execCommand Clipboard复制 Clipboard writeText Clipboard write copy cut事件 从剪贴板进行粘贴 document execCo
  • 【E2EL5】A Year in Computer Vision中关于图像增强系列部分

    http www themtank org a year in computer vision 部分中文翻译汇总 https blog csdn net chengyq116 article details 78660521 The M T
  • eclipse修改文字显示大小及html乱码修改编码格式

    1 修改字体大小 2 修改编码格式 html文件出现乱码时需要修改编码格式 备注 有时候修改后还会是乱码 重启eclipse即可
  • 2022年7月3日leetcode每日一题打卡——112.路径总和

    一 题目描述与要求 112 路径总和 力扣 LeetCode 题目描述 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 判断该树中是否存在 根节点到叶子节点 的路径 这条路径上所有节点值相加等于目标和 target
  • 基于YOLO-V5的结核杆菌目标检测系统【毕业设计,AI+医疗】

    项目背景 结核病 Tuberculosis TB 是由结核分枝杆菌 Mycobacterium tuberculosis 引起的一种慢性人畜共患病 它不受年龄 性别 种族 职业 地区的影响 人体许多器官 系统均可患结核病 其中以肺结核最为常
  • HBase Java 编程

    一 环境配置 1 引入Maven 库
  • JavaScript 中使用Ajax进行网络post请求和get请求

    博主前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住也分享一下给大家 点击跳转到网站 前言 使用Ajax进行网络请求 默认是异步请求 而且不需要刷新页面 就可以发送请求 获取服务端返回来的数据 一 Ajax的get请求 做
  • apache kafka配置中request.required.acks含义

    Kafka producer的ack有3中机制 初始化producer时的producerconfig可以通过配置request required acks不同的值来实现 0 这意味着生产者producer不等待来自broker同步完成的确
  • 算法--大数开方

    之前已找到比较好的大数乘法算法 现在我们来解决大数开方问题 如有大数n 求其开方x 则x与n必满足x x n 也就是说我们能遍历x找到n的开方 但是问题在于我们是不可能对大数遍历的 如果我们可以确定它的大致范围 仅仅测试几个不容易直接判断的