大数开方模版:

题目:大数开方

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DEPTH 10
typedef int BigInteger[10100];
int comp(const BigInteger a,const int c,const int d,const BigInteger b) //大数比较
{
int i,t=0,O=-DEPTH*2;
if(b[0]-a[0]<d&&c) return 1;
for(i=b[0];i>d;i--)
{
t=t*DEPTH+a[i-d]*c-b[i];
if(t>0) return 1;
if(t<O) return 0;
}
for(i=d;i;i--)
{
t=t*DEPTH-b[i];
if(t>0) return 1;
if(t<O) return 0;
}
return t>0;
}
void sub(BigInteger a,const BigInteger b,const int c,const int d) //大数减
{
int i,O=b[0]+d;
for(i=1+d;i<=O;i++)
if((a[i]-=b[i-d]*c)<0)
a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH;
for(;a[i]<0;a[i+1]+=(a[i]-DEPTH+1)/DEPTH,a[i]-=(a[i]-DEPTH+1)/DEPTH*DEPTH,i++);
for(;!a[a[0]]&&a[0]>1;a[0]--);
}
void Sqrt(BigInteger b,BigInteger a) //开平方
{
int h,l,m,i;
memset((void*)b,0,sizeof(BigInteger));
for(i= b[0]=(a[0]+1)>>1;i;sub(a,b,m,i-1),b[i]+=m,i--)
for(h=DEPTH-1,l=0,b[i]=m=(h+l+1)>>1;h>l;b[i]=m=(h+l+1)>>1)
if(comp(b,m,i-1,a)) h=m-1;
else l = m;
for(;!b[b[0]]&&b[0]>1;b[0]--);
for (i = 1; i <= b[0]; b[i++] >>= 1);
}
char str[10100];
BigInteger a,b;
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
scanf("%s",str);
a[0]=strlen(str);
for(int i=1; i<=a[0]; i++)
a[i]=str[a[0]-i]-'0';
Sqrt(b,a);
for(int i=b[0]; i>=1; i--)
printf("%d",b[i]);
printf("\n");
if(t)
puts("");
}
return 0;
}

题目:1153. Supercomputer

题目大意:N=x*(x+1)/2,给你N (N < 10600),输出x

分析:求sqrt(2*N)即可

#include <iostream>
#include <string.h>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
using namespace std;
#define MAXN 20000
int big(char s1[],char s2[])
{
int len1,len2,i,q;
q=0;
while(s1[q]=='0') q++;
strcpy(s1,s1+q);
if(strlen(s1)==0)
{
s1[0]='0';
s1[1]=0;
}
q=0;
while(s2[q]=='0') q++;
strcpy(s2,s2+q);
if(strlen(s2)==0)
{
s2[0]='0';
s2[1]=0;
}
len1=strlen(s1);
len2=strlen(s2);
if(len1>len2)
return 1;
else if(len1<len2)
return 0;
else
{
for(i=0;i<len1;i++)
{
if(s1[i]>s2[i])
return 1;
else if(s1[i]<s2[i])
return 0;
}
}
return 0;
}
void mul(char s[],int t,char re[])   //乘
{
int left,i,j,k,len;
char c;
left=0;
j=0;
for(i=strlen(s)-1;i>=0;i--)
{
k=t*(s[i]-'0')+left;
re[j++]=(k%10)+'0';
left=k/10;
}
while(left>0)
{
re[j++]=(left%10)+'0';
left/=10;
}
re[j]=0;
len=strlen(re);
for(i=0;i<len/2;i++)
{
c=re[i];
re[i]=re[len-1-i];
re[len-1-i]=c;
}
return;
}
void sub(char a[],char b[])   //减
{
int left,len1,len2,temp,j;
len1=strlen(a)-1;
len2=strlen(b)-1;
left=0;
while(len2>=0)
{
temp=a[len1]-b[len2]+left;
if(temp<0)
{
temp+=10;
left=-1;
}
else
left=0;
a[len1]=temp+'0';
len1--;
len2--;
}
while(len1>=0)
{
temp=a[len1]-'0'+left;
if(temp<0)
{
temp+=10;
left=-1;
}
else
left=0;
a[len1]=temp+'0';
len1--;
}
j=0;
while(a[j]=='0') j++;
strcpy(a,a+j);
if(strlen(a)==0)
{
a[0]='0';
a[1]=0;
}
return;
}
void sqr(char s[],char re[])    //开方
{
char temp[MAXN];
char left[MAXN];
char p[MAXN];
int i,j,k,len1,len2,q;
len1=strlen(s);
if(len1%2==0)
{
left[0]=s[0];
left[1]=s[1];
left[2]=0;
j=2;
}
else
{
left[0]=s[0];
left[1]=0;
j=1;
}
re[0]='0';
re[1]=0;
q=0;
while(j<=len1)
{
mul(re,20,temp);
len2=strlen(temp);
for(i=9;i>=0;i--)
{
temp[len2-1]=i+'0';
mul(temp,i,p);
if(!big(p,left))
break;
}
re[q++]=i+'0';
re[q]=0;
sub(left,p);
len2=strlen(left);
left[len2]=s[j];
left[len2+1]=s[j+1];
left[len2+2]=0;
j+=2;
}
}
int main()
{
char s[MAXN],s2[MAXN],re[MAXN];
int  an[MAXN];
char ans[MAXN];
int i;
while(scanf("%s",s)!= EOF )
{
mul(s,2,s2);   //如果是对k*n开方这里就应该是mul(s,k,s2);
strcpy(s,s2);
re[0]=0;
sqr(s,re);
i=0;
while(re[i]=='0') i++;
strcpy(re,re+i);
printf("%s\n",re);
}
return 0;
}

大数开方(C++版)相关推荐

  1. 大数开方(Java版)

    题目:大数开方 Java代码:适合被开方数不超过1000位的. import java.util.*; import java.math.*; public class Main { public s ...

  2. java中大数开方_大数开方(Java版)

    Java代码:适合被开方数不超过1000位的. import java.util.*; import java.math.*; public class Main { public static vo ...

  3. ACM-ICPC 2018 焦作赛区网络预赛_J_ Participate in E-sports_Java大数开方

    传送门 题意:求n和 1+2+3+-.+(n-1) 这两个数字是不是完全平方数. 思路:大数开方,似乎是板子太弱了,在做第二个数字的时候T掉了,然后我就思考下满足(n-1)*n/2为完全平方数的数字并 ...

  4. 历届试题 矩阵翻硬币 蓝桥杯 大数开方 大数相乘

    历届试题 矩阵翻硬币   时间限制:1.0s   内存限制:256.0MB 问题描述 小明先把硬币摆成了一个 n 行 m 列的矩阵. 随后,小明对每一个硬币分别进行一次 Q 操作. 对第x行第y列的硬 ...

  5. JAVA应试技巧----大数开方

    大数开方--牛顿迭代法: 如果一个数的位数为偶数个,那么这个数开方之后就有n/2位: 如果一个数的位数为奇数个,那么这个数开方之后就有n/2+1位: 我们以num=1000为例,位数为4,偶数,那么开 ...

  6. c语言 大数开方,大数加法之C语言函数法(只有正数版)

    由于某些原因,我于今天2017-4-19将我的博文搬到博客园了,以后我就在这里扎根了. 之前想过在博客写文章方便日后复习,但一直未能实现,所以,现在这篇是我个人人生中第一篇博客,所以写博客完全没经验, ...

  7. Go语言实现大数开方程序

    Go语言的big包实现大数运算,但是有关大整数运算,似乎没有相应的开方程序. 这里给出的程序,实现了大整数的开方运算函数.该程序是基于大整数开方运算的算法实现的. Go语言程序: // bigints ...

  8. java中大数开方_Java中的大数运算

    # 一:大数运算出现的背景 java里面整型int与浮点型float,double它们存放数据的范围是有限的,当出行更大的数值时会发生溢出. 最典型的场景是金融行业,直接使用单精度或者双精浮点数来表示 ...

  9. Resistors in Parallel(Gym - 102028E 2018 ICPC 焦作E题 大数+规律C++版)

    链接:传送门 题外话:这套题作为队内训练赛,然后找规律找炸了,后来补题,发现大家都在用java或者python写,太难了,不会啊,只会C++的萌新躲在墙角瑟瑟发抖,写下了这个C++版本的解题报告 题意 ...

最新文章

  1. 软件隐喻的本质与模式
  2. java上传网络图片_java网络编程之图片上传
  3. 用计算机组成原理+唐朔飞的,计算机组成原理 唐朔飞 习题解答
  4. 平衡二叉树,AVL树之图解篇
  5. 关刀机器人_小学机器人活动总结
  6. 微信网页授权,并获取用户头像,昵称等基本信息代码实例
  7. 画出计算机网络的一般组成,计算机网络习题(有答案).pdf
  8. 【2022.3】尚硅谷Vue.js从入门到精通基础笔记(理论+实操+知识点速查)
  9. 阿里巴巴编码规范认证之步骤详解
  10. 金融科技在互联网金融行业性风险防范领域的应用
  11. kibana6.0版本汉化工具
  12. linux copy 复制文件夹及子文件夹
  13. [Java] 身份证号码验证
  14. shell 脚本定时监控Linux内存清除缓存
  15. mac 笔记本 终端使用管理员权限
  16. 移动互联网业务的产业链
  17. 程序员再忙也应该看看《琅琊榜》
  18. python 数据分析--数据处理工具Pandas(2)
  19. 用python写一个魂斗罗
  20. 第1章第2节:PowerPoint的选项卡 [PowerPoint精美幻灯片实战教程]

热门文章

  1. React是什么及特点
  2. SpringBoot高级-检索-Elasticsearch简介安装
  3. SpringBoot 路径访问控制
  4. 课程介绍 复习 创建对象的三种方式 自定义构造函数创建对象 工厂模式创建对象
  5. c#启动mysql数据库服务器_c#判断数据库服务器是否已经启动的方法
  6. 210317阶段三opencv
  7. 覆盖网络 Flannel 0.7
  8. iOS9的几个新关键字(nonnull、nullable、null_resettable、__null_unspecified)
  9. 158.5. manifests
  10. brk(), sbrk() 用法详解【转】