手动开大数平方算法UVa10023

题目链接:UVa 10023

 1 import java.math.BigInteger;
 2 import java.util.Scanner;
 3 public class Main {
 4     public static void sqrt(BigInteger bi){
 5         String str;
 6         str=bi.toString();
 7         int m=str.length();
 8         if(m%2!=0)
 9         str="0"+str;
10         BigInteger a,b,c,d,ans;
11         b=BigInteger.valueOf(0);
12         c=BigInteger.valueOf(0);
13         ans=BigInteger.valueOf(0);
14         try{
15             for(int i=0;i<m;i+=2){
16                 a=b.multiply(new BigInteger("100")).add(new BigInteger(str.substring(i,i+2)));
17                 for(int j=0;j<10;j++){
18                     d=c.multiply(new BigInteger("20")).add(BigInteger.valueOf(j+1)).multiply(BigInteger.valueOf(j+1));
19                     if(d.compareTo(a)>0){
20                         c=c.multiply(new BigInteger("20")).add(BigInteger.valueOf(j)).multiply(BigInteger.valueOf(j));
21                         b=a.subtract(c);
22                         ans=ans.multiply(new BigInteger("10")).add(BigInteger.valueOf(j));
23                         c=ans;
24
25                         break;
26                     }
27                 }
28             }
29         }catch(Exception e){
30             e.getStackTrace();
31         }
32         System.out.println(ans);
33     }
34     public static void main(String args[]){
35         Scanner cin=new Scanner(System.in);
36         int n;
37         n=cin.nextInt();
38         for(int k=0;k<n;k++){
39             if(k!=0)
40                 System.out.println();
41             sqrt(cin.nextBigInteger());
42         }
43     }
44 }
时间: 2024-07-29 16:48:52

手动开大数平方算法UVa10023的相关文章

【手动开栈】【dfs序】【树状数组】【Tarjan】bzoj2819 Nim

考虑树状数组区间修改(只对其子树的答案有影响)点查询,每个点记录的是它到根路径上的权值异或和. 答案时query(L)^query(R)^a[lca]. 这种方法在支持区间加法.减法的树上询问的时候可以避免树链剖分. 可能爆栈,考虑手动开栈.(诶诶Tarjan预处理lca的时候怎么没手动开栈?不要在意^_^) 实际上不会爆的. #include<cstdio> #include<stack> #include<algorithm> #include<queue&g

[欧拉回路+手动开栈] poj 1780 Code

题目链接: http://poj.org/problem?id=1780 Code Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2037   Accepted: 751 Description KEY Inc., the leading company in security hardware, has developed a new kind of safe. To unlock it, you don't need

#转 大数阶乘算法

大数阶乘算法 大数阶乘算法 前几天朋友问我一个问题:“10000的阶乘怎么算?”当时我就有点懵,“10000”这个数字太大了,无论用什么数据类型保存结果都会溢出.这可怎么办呢?一时间束手无策.然后被一顿鄙视.后来经朋友的提醒,才恍然大悟,终于知道怎么实现了,原来是使用数组来模拟数字,这样无论结果数字有多大,只要数组的长度够长就能表示出来,用这个办法可以进行大数据的运算.看起来还是挺有用的.我把它用程序实现出来,如果有用到的地方还可以借鉴一下.(最起码还可以拿来鄙视别人^_^)首先定义一个足够长的

iOS中计算两个大数相加算法(OC实现)

我们知道计算机的数据类型不同,所能表示的数据量级也不相同,比如: unsigned int : 0-4294967295   int : -2147483648-2147483647 unsigned long : 0-4294967295long :  -2147483648-2147483647long long : -9223372036854775808 ~ 9223372036854775807unsigned long long : 0 ~ 18446744073709551615

poj水题-1001 一个简单的大数乘幂算法实现

说到底就是一个大数乘幂运算,小数点后零.明白大数乘幂算法直接搞. 这里就有几个问题: 1.幂位数小可以用二进制容器表示(取模更好,但我是为了练习STL) 2.n位大数用string表示,外加一个int型表示小数点位置 3.字符串×字符串用小学竖式乘法算法就行,注意补零.位数多时两个string两个string地加. 代码长,但理解容易,大数乘法,加法函数很多都能重用. 1 #include <iostream> 2 #include <vector> 3 #include <

49. 搜狗面试题: 大数相乘算法

分析: 大数能大到整形类型存储不了.须要借助于其它的算法,来完毕乘法运算. 能够使用口算乘法的步骤来模拟乘法操作.例如以下: 123 *   122 = 3 4 6 +                   3 4 6 +                1 2 3 =                  1 5 0 0 6 实现例如以下: #include<iostream> #include<string.h> using namespace std; char* MutiBiger

大数相乘算法C++版

#include <iostream> #include <cstring> using namespace std; #define null 0 #define MAXN 51 //大数相乘 char *big_cheng(char line1[], char line2[]) { short s1[MAXN], s2[MAXN], s[MAXN];//s1,s2:两个乘数:s:乘积的结果 int i, j, k, c; int len1, len2, len; len1 =

(语法百题44)手动开3次方

知识点: 数学函数的用法 函数名pow 原型:double pow (double x,double y): 摘要: int x = pow(4, 5); x的类型要与pow里的第一个元素相同 比如double x = pow(4, 5);就是错误的,要写成double x = pow(4.0, 5); 定义的同时赋值用的. 内容: 输入一个正数在100以内,输出它的3次方根(保留2位小数) 输入说明: 一行一个数 输出说明: 一行一个数 输入样例: 100 输出样例 : 4.64 #inclu

求大数阶乘算法

阶乘很好求,递归就行了,但对于较大的数,阶乘的结果非常非常大,木有办法,只能用string来处理. 我们用string的乘法来做.经测试,这个程序能运行的最大n值差不多能到3000,和windows上自带的科学计算器差不多:) string multiply(string num1, string num2) { int len1 = num1.size(), len2 = num2.size(), len = len1 + len2; string str(len, '0'); for (in