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 ...
随机推荐
- linux命令sed学习笔记
sed其实就是两个主要的知识点,那就是“怎么选择”和“怎么操作”!
- C语言基础程序设计
1 概论 程序(指令和数据的集合)在运行时,首先会被加载到内存(此时称为进程),然后由CPU通过控制器的译码从内存中读取指令,并按照指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再 ...
- 【实习记】2014-08-20实习的mini项目总结
实习项目总结文档 项目介绍 项目逻辑很简单,只有几个页面,只能登录,查看,支付和退款.主要作用是熟悉C++的cgi的web服务开发方式. 项目页面截图 图一:登录页面 图二:买家查看 图三:买 ...
- node初步一:HTTP请求
一. 创建pathtest.js文件 var http= require('http' ); var url= require('url' ); function start (){ function ...
- 汤姆大叔的6道js题目
汤姆大叔的6道javascript编程题题解 看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) 1 ...
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
由浅入深,主要介绍maven的用途.核心概念(Pom.Repositories.Artifact.Build Lifecycle.Goal).用法(Archetype意义及创建各种项目).maven常 ...
- PHP的类自动加载机制
在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来. 这个在小规模开发的时候,没什么大问题.但在大型的开发项目中, ...
- centos乱码问题解决
1.yum groupinstall chinese-support 安装中文语言包 2.vi /etc/sysconfig/i18n 修改文件为: LANG="zh_CN.UTF-8&qu ...
- 金山网络2014春季Android实习生招聘-成都站-笔试第二题
一个文件名为input.txt的文件当中,每一行都有一个单词,要求统计单词出现的频率,并且按照从小到大出现次数打印,次数相同的按照首字母顺序排序. package jinshanwangluo.exa ...
- Contest20140711 loop 数论
loop|loop.in|loop.out 题目描述: 有N个点. 现在重复这样的操作: 随机找一个出度为0的点p1,随机找一个入度为0的点p2,连一条有向边从p1指向p2.直到没有出度为0的点. 统 ...