vijos-1447 开关灯泡-大整数开方算法
描述
一个房间里有n盏灯泡,一开始都是熄着的,有1到n个时刻,每个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的。
提示
范围:40%的数据保证,n<=maxlongint
100%的数据保证,n<=10^200
**********************************************************************
1.编个小程序,打表(1-30),可以看出规律 f(n)=sqrt(n)的下界。
2.思考如何求大整数的根号:两种思路:迭代法,例如二分法、牛顿迭代等;
打点法:精确计算,一步到位。笔算开平方法,我二姐教过我。真是太好了。
我只想简单说个大概:
i。从后往前,隔两位点一个小数点
ii。从前往后,试商,做差,落下来
3.打点法肯定速度非常快O(200*100)的复杂度:根最大是100位,每求一位最多200位的操作。这个过程需要用到大数乘法、减法、移位。
4.最后一点,在编大数运算时最好按照位数固定进行运算,这样虽然牺牲了一点效率,但可读性好、易于实现。
5.要背下来大数运算,不要只会抄scl,唯有如此,方能随用随写,剑心合一。
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
#define size 205
int n[205], ni;
int ans[205];
int now[205];
int two[205];
int mu[205];
void getTwo(){//two=(ans*2)<<1;
memset(two, 0, sizeof(two));
int i;
for (i = 0; i < size; i++){
two[i] += (ans[i] << 1);
two[i + 1] = two[i] / 10;
two[i] %= 10;
}
for (i = size - 2; i >= 0; i--)
two[i + 1] = two[i];
}
void getNow(){
int i;
for (i = size - 3; i >= 0; i--){
now[i + 2] = now[i];
}
now[1] = n[ni--];
now[0] = n[ni--];
}
void mul(int k){//mu=two_k*k
memset(mu, 0, sizeof(mu));
int i;
for (i = 0; i < size; i++){
mu[i] += two[i] * k;
mu[i + 1] = mu[i] / 10;
mu[i] %= 10;
}
}
int cmp(){//now-mu
int i;
for (i = size - 1; i >= 0; i--)
if (now[i] != mu[i])
return now[i] - mu[i];
return 0;
}
void sub(){//now-mu
int i;
for (i = 0; i < size - 1; i++){
now[i] -= mu[i];
if (now[i] < 0){
now[i + 1]--;
now[i] += 10;
}
}
}
void getAns(){
int i;
for (i = size - 2; i >= 0; i--){
ans[i + 1] = ans[i];
}
for (i = 9; i >= 0; i--){
two[0] = i;
mul(i);
if (cmp() >= 0){
ans[0] = i;
sub();
return;
}
}
}
void go(){
while (ni >= 0){
getTwo();
getNow();
getAns();
}
}
int main(){
freopen("in.txt", "r", stdin);
char a[205];
int i;
for (i = 0; a[i]; i++);
ni = i;
memset(n, 0, sizeof(n));
for (i = 0; i < ni; i++)
n[i] = a[ni - 1 - i] - '0';
if ((ni & 1) == 0)ni--;
memset(ans, 0, sizeof(ans));
memset(now, 0, sizeof(now));
go();
for (i = size - 1; ans[i] == 0; i--);
for (; i >= 0; i--)cout << ans[i];
return 0;
}
vijos-1447 开关灯泡-大整数开方算法的更多相关文章
- 【老鸟学算法】大整数乘法——算法思想及java实现
算法课有这么一节,专门介绍分治法的,上机实验课就是要代码实现大整数乘法.想当年比较混,没做出来,颇感遗憾,今天就把这债还了吧! 大整数乘法,就是乘法的两个乘数比较大,最后结果超过了整型甚至长整型的最大 ...
- vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)
P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状 ...
- 【vijos】1447 开关灯泡(高精度+特殊的技巧)
https://vijos.org/p/1447 一开始想了想似乎只想到了与约数个数有关,即约数个数为奇数那么显然是亮的. 竟然没想到完全平方数..sad.. 在正因子中,只有完全平方数的正因子才是奇 ...
- 大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- 大整数算法[09] Comba乘法(原理)
★ 引子 原本打算一篇文章讲完,后来发现篇幅会很大,所以拆成两部分,先讲原理,再讲实现.实现的话相对复杂,要用到内联汇编,要考虑不同平台等等. 在大整数计算中,乘法是非常重要的,因为 ...
- C# 基于大整数类的RSA算法实现(公钥加密私钥解密,私钥加密公钥解密)
但是C#自带的RSA算法类RSACryptoServiceProvider只支持公钥加密私钥解密,即数字证书的使用. 所以参考了一些网上的资料写了一个RSA的算法实现.算法实现是基于网上提供的一个大整 ...
- [转]大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- 从大整数乘法的实现到 Karatsuba 快速算法
Karatsuba 快速乘积算法是具有独特合并过程(combine/merge)的分治算法(Karatsuba 是俄罗斯人).此算法主要是对两个整数进行相乘,并不适用于低位数(如 int 的 32 位 ...
- 算法笔记_034:大整数乘法(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 1 问题描述 计算两个大整数相乘的结果. 2 解决方案 2.1 蛮力法 package com.liuzhen.chapter5; import ...
随机推荐
- Java魔法堂:找外援的利器——Runtime.exec详解
一.前言 Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用C/C++来获取,但对于对C/C++和Windows API不熟的码农是一系列复杂的学习和踩坑过程.那能不 ...
- C++浅析——返回对象的函数
一.原码分析 1.1 测试代码 为了方便查看拷贝构造函数调用过程,自定义了拷贝构造函数,但啥也没干. class CTEST { public: int m_nData; //Method: publ ...
- SpringMVC从入门到精通之第二章
这一章原本我是想写一个入门程序的,但是后来仔细想了一下,先从下面的图中的组件用代码来介绍,可能更效果会更加好一点.第一节:开发准备介绍之前先说下我的开发调试环境:JDK 1.7的64位 .Eclips ...
- 【原】一张图片优化5K的带宽成本
上周,我参加了公司的一门课程<网站性能优化>,讲师提出了一个问题:一张图片优化后减少5K,1年内可以大概省下多少宽带成本呢?非常好奇,仔细听完讲师分析,计算出来的数据让小伙伴们都惊呆了,仅 ...
- Stanford机器学习笔记-4. 神经网络Neural Networks (part one)
4. Neural Networks (part one) Content: 4. Neural Networks (part one) 4.1 Non-linear Classification. ...
- 第14章 位图和位块传输_14.4 GDI位图对象(2)
14.4.7 在位图上绘图 (1)在内存设备环境中绘图(与真实DC不同的是,内存DC的显示表面是个位图) (2)GetTextExtentPoint32函数:用于确定文本字符串的像素大小.(此大小就是 ...
- Unity游戏暂停之Update与FixedUpdate区别
游戏暂停 示例程序 下面这段代码演示游戏暂停 using UnityEngine; using System.Collections; public class GamePauseTest : Mon ...
- java 28 - 7 JDK8的新特性 之 接口可以使用方法
JDK8的新特性: http://bbs.itcast.cn/thread-24398-1-1.html 其中之一:接口可以使用方法 interface Inter { //抽象方法 public a ...
- Json数据与Json数据转换
1.json数据 [{\"IS_DISTRIBUTOR_LIMIT\":0,\"PROVISION_PRICE\":null,\"PRO_STATUS ...
- Oracle Delete inner的方式,级联删除子表的数据方式。
例子1: from table2 b where a.id=b.id) 例子2: rebatepolicy表是主表,rebatepolicyitems是从表,从表有主表的主键,现在对于主表一些条件的数 ...