寒假练习 03

今天刷了高精度专题,本来准备写一个高精度类,然后直接套模版,后来发现根据每题的要求分开写高精度反而效率高。

主要涉及了高精度加法、乘法、除法、取余(其中后两项为高精度和低精度进行运算)。

终于打过一遍高精度除以低精度了,高精度专题也算圆满了。

UVaOJ 424

高精度加法,水题。

#include <iostream>
#include <string>
#include <memory.h>

using namespace std;

const int MAX = 10240;

int nLen;
int pData[MAX]; 

int main()
{
	nLen = 1;
	memset(pData, 0, sizeof(pData));
	string x;
	while(cin >> x)
	{
		if(x != "0")
		{
			while(x[0] == ‘0‘) { x = x.substr(1, x.length() - 1); }
			nLen = max(nLen, (int)x.length());
			for(int i = 1; i <= x.length(); i++)
			{
				pData[i] += x[x.length() - i] - ‘0‘;
				pData[i + 1] += pData[i] / 10;
				pData[i] %= 10;
			}
			while(pData[nLen + 1]) { nLen++; }
		}
		else
		{
			for(int i = nLen; i >= 1; i--)
			{ cout << pData[i]; }
			cout << endl;
			nLen = 1;
			memset(pData, 0, sizeof(pData));
		}
	}
	return 0;
}

  

UVaOJ 10106

高精度乘法,要注意的是某一个乘数为0的情况,要特判一下。

#include <iostream>
#include <string>
#include <memory.h>

using namespace std;

const int MAX = 10240;

int nLen;
int pData[MAX]; 

int main()
{

	string x, y;
	while(cin >> x >> y)
	{
		if(x.length() < y.length()) { swap(x, y); }
		nLen = x.length() + y.length();
		memset(pData, 0, sizeof(pData));
		for(int i = 1; i <= y.length(); i++)
		{
			for(int j = 1; j <= x.length(); j++)
			{
				pData[i + j - 1] += (x[x.length() - j] - ‘0‘) * (y[y.length() - i] - ‘0‘);
				pData[i + j] += pData[i + j - 1] / 10;
				pData[i + j - 1] %= 10;
			}
		}
		while(nLen && !pData[nLen]) { nLen--; }
		if(nLen == 0) { nLen = 1; }
		for(int i = nLen; i >= 1; i--)
		{ cout << pData[i]; }
		cout << endl;
	}
	return 0;
}

  

UVaOJ 465

判断加数、乘数以及结果是否在int范围内,一开始把结果都算出来再比较。后来查了资料发现可以直接用double过,其中使用到了atof这个命令。

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

const int MAX_INT = 2147483647;

int main()
{
	char dwOpt;
	string x, y;
	while(cin >> x >> dwOpt >> y)
	{
		cout << x << " " << dwOpt << " " << y << endl;
		double a, b;
		a = atof(x.c_str());
		b = atof(y.c_str());
		if(a > MAX_INT) { cout << "first number too big" << endl; }
		if(b > MAX_INT) { cout << "second number too big" << endl; }
		if(dwOpt == ‘+‘ && a + b > MAX_INT) { cout << "result too big" << endl; }
		if(dwOpt == ‘*‘ && a * b > MAX_INT) { cout << "result too big" << endl; }
	}
}

  

UVaOJ 748

带有小数的乘方问题。

先确定小数点的位数,然后去掉小数点,进行高精度乘方运算,最后加上小数点即可。

#include <iostream>
#include <string>
#include <memory.h>

using namespace std;

const int MAX = 10240;

int nLen, nDot;
int pData[MAX]; 

string Solve(string x, string y);

int main()
{
	string x;
	int y;
	while(cin >> x >> y)
	{
		while(x[x.length() - 1] == ‘0‘) { x = x.substr(0, x.length() - 1); }
		nDot = x.length() - x.find(‘.‘) - 1;
		nDot *= y;
		x = x.substr(0, x.find(‘.‘)) + x.substr(x.find(‘.‘) + 1, x.length() - x.find(‘.‘) - 1);
		string z = "1";
		for(int i = 1; i <= y; i++)
		{ z = Solve(z, x); }
		if(z.length() <= nDot)
		{
			cout << ".";
			for(int i = z.length(); i < nDot; i++)
			{ cout << "0"; }
			cout << z << endl;
		}
		else
		{
			for(int i = 0; i < z.length() - nDot; i++)
			{ cout << z[i]; }
			cout << ".";
			for(int i = z.length() - nDot; i < z.length(); i++)
			{ cout << z[i]; }
			cout << endl;
		}
	}
	return 0;
} 

string Solve(string x, string y)
{
	if(x.length() < y.length()) { swap(x, y); }
	nLen = x.length() + y.length();
	memset(pData, 0, sizeof(pData));
	for(int i = 1; i <= y.length(); i++)
	{
		for(int j = 1; j <= x.length(); j++)
		{
			pData[i + j - 1] += (x[x.length() - j] - ‘0‘) * (y[y.length() - i] - ‘0‘);
			pData[i + j] += pData[i + j - 1] / 10;
			pData[i + j - 1] %= 10;
		}
	}
	while(nLen && !pData[nLen]) { nLen--; }
	if(nLen == 0) { nLen = 1; }
	string z = "";
	for(int i = 1; i <= nLen; i++)
	{ z = (char)(pData[i] + ‘0‘) + z; }
	return z;
}

  

UVaOJ 10494

高精度除以低精度以及取模运算。在网上搜了资料,终于学会了。但是要注意0 % X的情况。

另外想说的是非常喜欢这道题目的标题“If We Were A Child Again”,勾起了多少回忆。

#include <iostream>
#include <memory.h>

using namespace std;

const int MAX = 10240;

int nLen;
int pData[MAX], pAns[MAX];

string Solve(string x, long long y, char dwOpt);

int main()
{
	char dwOpt;
	string x;
	long long y;
	while(cin >> x >> dwOpt >> y)
	{ cout << Solve(x, y, dwOpt) << endl; }
	return 0;
}

string Solve(string x, long long y, char dwOpt)
{
	memset(pData, 0, sizeof(pData));
	memset(pAns, 0, sizeof(pAns));
	nLen = x.length();
	for(int i = 1; i <= x.length(); i++)
	{ pData[i] = x[x.length() - i] - ‘0‘; }
	long long d = 0;
	for(int i = nLen; i >= 1; i--)
	{
		d = d * 10 + pData[i];
		pAns[i] = d / y;
		d %= y;
	}
	while(nLen && pAns[nLen] == 0) { nLen--; }
	if(nLen == 0) { nLen = 1; }
	string z = "";
	if(dwOpt == ‘/‘)
	{
		for(int i = 1; i <= nLen; i++)
		{ z = (char)(pAns[i] + ‘0‘) + z; }
	}
	else
	{
		while(d)
		{
			z = (char)(d % 10 + ‘0‘) + z;
			d /= 10;
		}
		if(z == "") { z = "0"; }
	}
	return z;
}

  

今天由于题目相对比较少,所以做的比较快。接下来一个专题应该是排序和检索。

时间: 2024-10-05 20:14:30

寒假练习 03的相关文章

寒假作业03

寒假作业03 0. 先来闲聊一下 我还记得以前的时候家严经常去某个,呃,著名的电子一条街去买那些各种各样的装系统光盘(或者其他啥的?忘了),基本都是windows的,啥啥纯净版xp,啥雨林木风xp.当然那时候还小,对电脑的印象就是玩游戏,对电脑系统啥的一窍不通(现在也是,哈哈).即便如此,年轻的我还是意识到这些乱七八糟的光盘是有问题的,为啥?装了之后电脑又慢还总死机,于是就再去那条街去买新的盘,如此往复恶性循环,家里老电脑就是这样坏掉的.很明显这个教训并不是十分刻骨铭心,因为新电脑也开始遭受各种

2月3日-寒假进度03

今天心神俱疲,准备爬取淘宝数据,淘宝的反爬机制太严格了,用的python?selenium?chrome去爬的数据,一天就是在坑里挣扎, 1.谷歌浏览器驱动界面必须是有谷歌浏览器的哈,然后对应自己浏览器的版本去下载chromedriver.exe文件,下载地址可看下篇博客 2.可能因为版本问题或者网络问题,爬取数据时,经过页面跳转后,会出现标签定位不到的问题,但和同学沟通看来,我的这样但她却没类似问题,开始以为是我的标签没写对,研究了好久,浪费了很长时间.大概有3个小时都耗在这了,(欲哭无泪啊)

C语言寒假大作战03

1. 题目介绍 当我们刚刚进入程序的时候,便会出现这样的界面.帮助信息中十分清楚了讲了关于各个年级口算题的内容 其中: 一年级题目为不超过十位的加减法;二年级题目为不超过百位的乘除法;三年级题目为不超过百位的加减乘除混合题目. 我们需要 随机!!!!!! 生成口算题 ps: 使用rand()函数哦 这里我们规定如下格式: /*----- 一年级 -----*/ 0 - 6 = ___ 2 + 7 = ___ 2 + 4 = ___ 2 - 2 = ___ 1 + 9 = ___ /*-----

Java 对不同类型的数据文件的读写操作整合器[JSON,XML,CSV]-[经过设计模式改造](2020年寒假小目标03)

日期:2020.01.16 博客期:125 星期四 我想说想要构造这样一个通用文件读写器确实不容易,嗯~以后会添加更多的文件类型,先来熟悉一下文件内容样式: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beangroup> 3 <javabean> 4 <data name='code'>A001</data> 5 <data name='name'>

寒假学习进度03

日期:2020.01.17 博客期:126 星期五 这几天要准备离开家,出一趟远门,嗯~先把任务安排妥了,我最近由于需要还学会了一些简单脚本的制作,虽然也不难就是了.嗯~扯远了,今天干了什么呢?首先是把昨天的博客修补了一下,把JSON类的附加方法补了进去,将新的类图绘制并发布了.紧接着我在努力的使用C#编写成型的修改器,从网上翻遍了教程,那真的是难找啊!我做出来了发现还要做偏转,还有我的程序是64位的,它调用的方法是32位的,整在一起就是报错,唉~我找了这么多资源,真的有点儿绝望了,这才第几个小

大三寒假03

python安装完成. pc安装配置完成. 原文地址:https://www.cnblogs.com/gonT-iL-evoL-I/p/12232337.html

2020寒假 03

Ubuntu14安装Scala 并编译输出“Hello, World!” 环境 Linux  java version "1.8.0_162" 官网下载Scala 2.13.1 在Linux中选择.tgz进行下载,默认地址下载在Linux文件夹中的下载(~/下载/scala-2.13.1.tgz) 下载完成后解压到local 重命名并修改文件权限 sudo tar -zxf ~/下载/scala-2.13.1.tgz -C /usr/local # 解压到/usr/local中cd /

2017级面向对象程序设计寒假作业4

Deadline 2018.03.02 22:00 一.完成PTA题目集 题目集链接:https://pintia.cn/problem-sets/966322407656148992/problems 请独立完成,不要抄袭!助教会对提交的代码进行查重,若发现抄袭则倒扣分. 完成题目后请将提交结果的截图贴到下述博客的末尾. 二.自我总结博客 写一篇博客,作为在寒假中关于 C++ 已完成的自学内容的总结.博客中需要包括但不限于以下内容: 已学的内容总结 存疑的问题 花费的总时间 锻炼的代码行数 两

《大四上寒假总结》--3.10

一.几个时间点 寒假离校:1.25 离家返校:1.31 -- 在家时间不到6天 返家准备做手术:2.9 从家返校:2.10 二.具体细节 主要分为三个阶段: 1.熬夜欢愉 2.家里的"幸福"生活 3.医院*N 4.伪复习 (1).考试周结束后的萎靡生活 1.15周六早最后一次数学讨论班结束.正式进入寒假. 室友已经陆续离开.最后的HYE两天后的周一中午飞机. 对于这段时间的记忆就是几乎每天都是看直播,同时身体超级难受 T^T..... 看直播痴迷到什么样的程度?特比喜欢一个叫鲍鲍的主播