111. Very simple problem

每个测试点时间限制: 0.50 sec. 
每个测试点内存限制: 4096 KB

给你一个自然数X,输出平方小于或等于X的最大整数。

输入

输入包含一个自然数 X (1≤X≤101000).

输出

输出答案

样例输入

16

样例输出

4

================================华丽的分割线 ================================

  第一眼,觉得是个水题,看了数据范围发现暴难!
  我的第一个做法是,网上看到的一个:用X减1,再-3,再-5,再-7,再-2k-1,到小于0,输出K-1。
  最开始觉得不行,后来试了一下,发现:1=1=1^2 
                    1+3=4=2^2
                    1+3+5=9=3^2
                    ...

                    1+...+2*k-1=k^2
  感觉比下面要介绍的方法简单得多,尝试了一下,TLE了。。。。

  然后就是笔算开根,看了半天才看懂,推荐个地方吧:
  http://www.gaokw.com/gwy/xingce/4183.html,有图有解释,觉得不错。
  再一个,我的代码应该好懂,因为函数都单独抽取出来了,没堆在一起,有面向对象的感觉,呵呵。

#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define USE 4
#define INF 10000
#define MAX 500
typedef struct {int num[MAX], len;
}bignum;
char str[1000];
bignum a, b, c;void add(bignum *a, int k)
{int i;for(i = 1; i <= a->len; i++){if(!k){break;}a->num[MAX - i] += k;k = a->num[MAX - i] / INF;a->num[MAX - i] %= INF;}if(k){a->num[MAX - i] = k;a->len++;}
}void dec(bignum *a, bignum *b)
{int i, j = 0;int len = b->len;for(i = 1; i <= len; i++){a->num[MAX - i] = a->num[MAX - i] - b->num[MAX - i] - j;j = 0;while(a->num[MAX - i] < 0){a->num[MAX - i] += INF;j++;}}if(j){a->num[MAX - i] -= j;}for(i = a->len; i >= 1; i--){if(a->num[MAX - i]){break;}}a->len = i;
}void mul(bignum *a, int k)
{int i, j = 0;//考虑一个特殊情况, k=0时if(k == 0){memset(a, 0, sizeof(bignum));return;}for(i = 1; i <= a->len; i++){a->num[MAX - i] = a->num[MAX - i] * k + j;j = a->num[MAX - i] / INF;a->num[MAX - i] %= INF;}if(j){a->num[MAX - i] = j;a->len++;}
}void output(bignum *a)
{int i;printf("%d", a->num[MAX - a->len]);for(i = a->len - 1; i >= 1; i--){printf("%.*d", USE, a->num[MAX - i]);}printf("\n");
}int com(bignum *a, bignum *b)
{int i;if(a->len != b->len){return a->len - b->len;}for(i = a->len; i >= 1; i--){if(a->num[MAX - i] != b->num[MAX - i]){return a->num[MAX - i] - b->num[MAX - i];}}return 0;
}int getnum(int len)
{static int start = 0;int i, n = 0;for(i = 0; i < len; i++){n *= 10;n += str[start + i] - '0';}start += len;return n;
}int check(int k)
{memcpy(&c, &b, sizeof(b));//c = (20 * b + k) * k;mul(&c, k * 20);add(&c, k * k);if(com(&a, &c) >= 0){return 1;}return 0;
}int main(int argc, char **argv)
{int i, j, t, n;scanf("%s", str);n = strlen(str);if(n & 1){j = getnum(1);}else{j = getnum(2);}n = (n + 1) / 2;t = sqrt(j);add(&a, j - t * t);add(&b, t);for(i = 2; i <= n; i++){mul(&a, 100);add(&a, getnum(2));for(j = 9; j >= 0; j--){if(check(j)){break;}}dec(&a, &c);mul(&b, 10);add(&b, j);}output(&b);return 0;
}

转载于:https://www.cnblogs.com/yylogo/archive/2011/06/12/SGU-111.html

SGU 111 Very simple problem 翻译 题解相关推荐

  1. SGU 111 Very simple problem

    SGU_111 又一次写大数开平方了,由于Java写起来比较方便,所以就直接用Java写了. import java.math.BigInteger;import java.util.Scanner; ...

  2. mutiset HDOJ 5349 MZL's simple problem

    题目传送门 1 /* 2 这题可以用stl的mutiset容器方便求解,我对这东西不熟悉,TLE了几次,最后用读入外挂水过. 3 题解有O(n)的做法,还以为我是侥幸过的,后来才知道iterator ...

  3. BZOJ 4679/Hdu5331 Simple Problem LCT or 树链剖分

    4679: Hdu5331 Simple Problem 题意: 考场上,看到这道题就让我想起BZOJ4712洪水.然后思路就被带着飞起了,完全没去考虑一条链的情况,于是GG. 解法:先考虑一条链的做 ...

  4. COJ 1170 A Simple Problem

    题目:在一个由N个整数组成的数列中,最多能找到多少个位置连续的整数且其中的最大值与最小值之差不超过K呢? GDKOI 2003 又一道很类似的题(河床)使用的是动态规划,因为数据范围较小(复杂度为O( ...

  5. HDU4143-A Simple Question数论题解

    数论题HDU-4143 A Simple Problem 解题分析: 不能从下往上枚举,上限不明确,超时肯定会. 思路:需要将等式因式分解(y-x)(y+x)=n,看n的两个因子 一个记为 i=y-x ...

  6. Just a Simple Problem

    http://whu.contest.codeforces.com/group/LqmZzHyOQN/contest/234192/problem/E 题解:虽然不知道题目在干嘛 但是跑了几分钟的暴力 ...

  7. HDU2522 A simple problem【分数与小数】

    A simple problem Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...

  8. 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)

    [线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...

  9. poj 3243:A Simple Problem with Integers

    3243:A Simple Problem with Integers 查看 提交 统计 提示 提问 总时间限制:  5000ms  单个测试点时间限制:  2000ms  内存限制:  131072 ...

最新文章

  1. 2021年大数据常用语言Scala(二十四):函数式编程 过滤  filter
  2. A simple class to play sound on netcf (part 2)
  3. 淘宝大秒系统设计详解 | 许令波
  4. 产品研究:安装程序 或 移动端APP 为什么这么占用空间?
  5. 代码需要不断进化和改变
  6. python while break try 无法中断_解码不能正常工作并且while循环不能正确中断python...
  7. python ant_('python,-ANT--编程字典',)
  8. Vs2010创建WebService
  9. 开发中git的常用命令
  10. 20个最强的基于浏览器的在线代码编辑器
  11. EXCEL97版本(.xls)和EXCEL2007之后的版本(.xlsx)对比
  12. 年度总结—2019-2020
  13. 雨夜深思——开发平台(二)
  14. iOS app图标和相关尺寸
  15. Matlab中的正态分布概率函数
  16. 简单的基于交换机迁移的SDN控制器负载均衡实验
  17. word的页脚页码从9开始后面全是1,怎么解决?
  18. 经典例题C语言程序解决数学问题
  19. 一文搞懂G1垃圾回收器
  20. 微信跳一跳python自动代码解读1.0

热门文章

  1. C#+GDAL读取影像(1)
  2. No thread-bound request found: Are you referring to request attributes outside of an actual web requ
  3. 4位共阴极数码管的动态扫描电路VHDL设计
  4. 阿里巴巴资深算法专家刘忠义:聚星台——客户运营核心大数据与算法技术
  5. Windows Server 2016 NTP服务端和客户端配置
  6. python的撤销和回退_撤销和回退
  7. AD绘制PCB板框+定位孔(Altium Designer)
  8. java常用设计模式11—适配器模式
  9. 几种常用数据库的区别
  10. 软件测试自学怎么学?