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 ...
随机推荐
- CoreAnimation实现一个折线表
将折现表封装到一个view里,暴露给使用者的只有一个传入数据的方法. // // ChartLine.h // BoxingChampion //功能:根据传入的数组,绘制折线图 注意 其frame的 ...
- C# json与对象之间的相互转换
1. 添加命名空间 using System.Runtime.Serialization.Json; 2. WriteObject方法 // 从一个对象信息生成Json串 public static ...
- 【原创】win7同局域网下共享文件
本文章用于解决win7局域网共享文件问题: 首先保证两台机器可以ping通: 检测方法: win+R输入cmd打开命令行,输入ping 对方主机ip 不知对方ip可以在在命令行中输入ipconfig ...
- 正则过滤html标签
var html = "<p>好好学习,<br>天天向上</p>"; var re=/<[^>]+>/g; var text ...
- [转] 小tips: 使用 等空格实现最小成本中文对齐 ---张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=4562 一.重见天日第 ...
- Apache 禁止访问目录
1.打开apache配置文件httpd.conf 2.找到 <Directory /> Options Indexes AllowOverride None Order allow,den ...
- dotnet core 开发体验之Routing
开始 回顾上一篇文章:dotnet core开发体验之开始MVC 里面体验了一把mvc,然后我们知道了aspnet mvc是靠Routing来驱动起来的,所以感觉需要研究一下Routing是什么鬼. ...
- File System Shell
Overview appendToFile cat chgrp chmod chown copyFromLocal copyToLocal count cp du dus expunge get ge ...
- Xcode7之后常见问题整理-b
一.Xcode7,iOS9之后传出来的什么Xcode有鬼,被植入代码片段什么的,可以看看,了解一下http://drops.wooyun.org/news/8864 二.bitcode问题--未正确设 ...
- jQuery 表格插件25
jQuery 表格插件可以让你创建各种各样的表格布局,表格布局是报纸和杂志中最常见的布局,现在的网站中也很常见,在这篇文章中,我向大家推荐25个jQuery 的表格插件,你可以任意控制表格的行和列,用 ...