Very simple problem - SGU 111(大数开方)
分析:使用的是构造新数字法进行不断构造,然后逼近每一位数字,然后使用c++徒手敲了240多行代码,竟然过了........................很有成就感。
代码如下:
===============================================================================================================================
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std; const int MAXN = ; struct BigNum
{///数值保存从0位开始
int Size;///数的位数
int num[MAXN];///数值,逆序保存 BigNum(){
Size=;
memset(num, false, sizeof(num));
}
void Cin()
{
char s[MAXN]; scanf("%s", s);
Size = strlen(s); for(int i=Size-; i>=; i--)
num[i] = s[Size-i-] - '';
}
bool operator <= (const BigNum &b)const
{
if(Size > b.Size)return false;
if(Size < b.Size)return true; for(int i=Size-; i>=; i--)
{
if(num[i] > b.num[i])return false;
if(num[i] < b.num[i])return true;
} return true;
}
void operator = (const BigNum &b)
{
Size = b.Size; for(int i=; i<b.Size; i++)
num[i] = b.num[i];
}
void operator = (const int &b)
{
int tem = b; if(b == )
Size = ;
else
Size = (int)(log10(tem)+0.00001)+; for(int i=; i<Size; i++)
{
num[i] = tem % ;
tem /= ;
}
}
BigNum operator <<(const int &k)const
{
BigNum tmp; for(int i=Size-; i>=; i--)
{
tmp.num[i+k] = num[i];
}
tmp.Size = Size + k; tmp.CarryBit(); return tmp;
}
BigNum operator * (const BigNum &b)const
{
BigNum res; res.Size = Size + b.Size - ; for(int i=; i<b.Size; i++)
for(int j=; j<Size; j++)
{
res.num[i+j] += num[j] * b.num[i];
} res.CarryBit(); return res;
}
BigNum operator * (const int &b)const
{
BigNum res; res.Size = Size; for(int i=; i<Size; i++)
{
res.num[i] = num[i] * b;
} res.CarryBit(); return res;
}
BigNum operator + (const BigNum &b)const
{
BigNum res;
res.Size = max(b.Size, Size); for(int i=; i<res.Size; i++)
res.num[i] = num[i] + b.num[i];
res.CarryBit(); return res;
}
BigNum operator + (const int &b)const
{
BigNum res;
res = b; res.Size = max(res.Size, Size); for(int i=; i<res.Size; i++)
res.num[i] += num[i];
res.CarryBit(); return res;
}
BigNum operator - (const BigNum &b)const
{///b值小,先比较在进行相减
BigNum res; res.Size = Size;
for(int i=; i<Size; i++)
{
if(i < b.Size)
res.num[i] = num[i] - b.num[i];
else
res.num[i] = num[i];
}
res.CarryBit(); return res;
}
void CarryBit()
{///进位,注意减法的时候进位结果需要是非负数
for(int i=; i<Size; i++)
{
if(num[i] >= )
{
if(i+==Size)
{
num[i+] = ;
Size += ;
} num[i+] += num[i]/;
num[i] %= ;
}
else if(num[i] < )
{
num[i+] -= ;
num[i] += ;
}
}
while(Size > && !num[Size-])
Size -= ;
}
void Out()
{
for(int i=Size-; i>=; i--)
printf("%d", num[i]);
printf("\n");
}
};
int Find(const BigNum &a, BigNum &Mod)
{
int i;
BigNum t; for(i=; i<=; i++)
{
t = (((a*)<<)+i) * i; if(t <= Mod)
continue;
break;
} i--;
t = (((a*)<<)+i) * i; Mod = Mod - t; return i;
}
BigNum Sqrt(const BigNum &a)
{
BigNum ans, Mod;
int len=a.Size-; if(a.Size % == )
{
Mod = Mod + (a.num[len]*+a.num[len-]);
len -= ;
}
else
{
Mod = Mod + a.num[len];
len -= ;
} ans = Find(ans, Mod); while(len > )
{
Mod = (Mod<<) + (a.num[len]*+a.num[len-]);
ans = (ans<<) + Find(ans, Mod); len -= ;
} return ans;
} int main()
{
BigNum a; a.Cin();
a = Sqrt(a); a.Out(); return ;
}
Very simple problem - SGU 111(大数开方)的更多相关文章
- 快速切题 sgu 111.Very simple problem 大数 开平方 难度:0 非java:1
111.Very simple problem time limit per test: 0.5 sec. memory limit per test: 4096 KB You are given n ...
- A + B Problem II(大数加法)
http://acm.hdu.edu.cn/showproblem.php?pid=1002 A + B Problem II Time Limit: 2000/1000 MS (Java/Other ...
- HDU 1002 A + B Problem II (大数加法)
题目链接 Problem Description I have a very simple problem for you. Given two integers A and B, your job ...
- 蓝桥杯T126(xjb&大数开方)
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T126 题意:中文题诶- 思路:显然被翻转了奇数次的硬币为反面朝上,但是本题的数据量很大,所以O(n^2)枚举 ...
- HPU 1002 A + B Problem II【大数】
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- HDU 1002 A - A + B Problem II (大数问题)
原题代号:HDU 1002 原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1002 原题描述: Problem Description I have a ...
- A - 敌兵布阵 ——B - I Hate It——C - A Simple Problem with Integers(线段树)
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...
- POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)
A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...
- POJ 3468 A Simple Problem with Integers(线段树/区间更新)
题目链接: 传送门 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Description Yo ...
随机推荐
- Angularjs中编写指令模版
angular.module('moduleName', []).directive( 'namespaceDirectiveName', [ function() { return { restri ...
- Android Thread和AsyncTask
1. 线程Thread 2. 异步任务AsyncTask ------------------------------------------------- --------------------- ...
- Python学习 - 编写自己的ORM(2)
上一篇文章简单的实现了ORM(对象关系模型),这一篇文章主要实现简单的MySQL数据库操作. 想要操作数据库,首先要建立一个数据库连接.下面定义一个创建数据库连接的函数,得到一个连接叫做engine. ...
- WPF 自定义路由事件
如何:创建自定义路由事件 首先自定义事件支持事件路由,需要使用 RegisterRoutedEvent 方法注册 RoutedEvent C#语法 public static RoutedEvent ...
- SQL语句の循环添加数据
declare @i intset @i=1while @i<=1000begininsert into News_ITM(title,msg,subDateTime,author,imageP ...
- [BZOJ 3144] [Hnoi2013] 切糕 【最小割】
题目链接:BZOJ - 3144 题目分析 题意:在 P * Q 的方格上填数字,可以填 [1, R] . 在 (x, y) 上填 z 会有 V[x][y][z] 的代价.限制:相邻两个格子填的数字的 ...
- 【MongoDB】应用场景
24 Use Cases24.1 适合场景 Archiving and event logging 归档和日志记录 Document and Content Management Systems ...
- Sed&awk笔记之awk篇
http://blog.csdn.net/a81895898/article/details/8482333 Awk是什么 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但 ...
- 【POJ1330】Nearest Common Ancestors(树链剖分求LCA)
Description A rooted tree is a well-known data structure in computer science and engineering. An exa ...
- BLE开发的各种坑
这段时间在做低功耗蓝牙(BLE)应用的开发(并不涉及蓝牙协议栈).总体感觉 Android BLE 还是不太稳定,开发起来也是各种痛苦.这里记录一些杂项和开发中遇到的问题及其解决方法,避免大家踩坑.本 ...