uva 1543 - Telescope(dp+几何)

大数除法说的比较少或许不像加法减法那样简单,或许是用的不太多。到底怎么我也不知道。

反正你会了加法减法,乘法而不会除法,就像是,打开电脑而不玩游戏,心里难受。

我是从看到了大神博客后学习了一下。

http://blog.csdn.net/hitwhylz/article/details/9700935

博客中讲的很详细

让人一看就懂,我很佩服这位同学。果断的关注了。

毕竟别人写的是别人的。

自己写的才是自己的 。于是我就捋了捋,模仿这写了一遍;

思想就是:用减法来代替除法,但是一次一次的减太慢,我们就先见10的n次方次,n可不是乱来的 因为除数不能大于被除数 就以此来决定n的大小。

照着我下面的步骤先自己写一下试一试。

1我们来输入两个数,确定位数。判断大小关系;

2然后进行把输入的被除数除数进行倒置。因为做减法嘛,比如123-23 我们要先用3来减3 所以将数倒置把3放到0的位置我们就能从0开始逐个往后处理了。

3要处理的就是我们首先减多少。比如12345 - 2 因为我们先减10的n次方 我们在这决定先减20 还是200 还是2000

决定权在两个数位数相差多少。

4 下面我们要来做减法了 比如先减20000 下一次不能减20000了 ,我们就来减2000 这一次来处理。

并且来记录相减的次数 注意减20000 的时候减一次,和2000的时候减一次,这是相差10次的。

5 最后就是尾部的处理前导0 的问题了。

下满贴上代码:

#include<iostream>
using namespace std;
//基础操作大数除法
int substract(char *a,char*b,int alen,int blen)
{
	if(alen<blen)
		return -1;
	if(alen==blen)
	{
		for(int i=alen-1;i>=0;i--)
		{
			if(a[i]<b[i]) return -1;
			if(a[i]>b[i] )break;
		}
	}
	for(int i=0;i<alen;i++)
	{
		a[i]=a[i]-b[i];
		if(a[i]<0)
		{
			a[i]+=10;
			a[i+1]--;
		}
	}
	for(int i = alen-1;i>=0;i--)
	{
		if(a[i])
			return i+1;
	}
	return 0;
}

int main()
{
	int cases;
	cin>>cases;
	while(cases--)
	{
		char _a[100];
		char _b[100];
		int _c[100];
		memset(_c,0,sizeof(_c));
		cin>>_a>>_b;
		int alen = strlen(_a);
		int blen =strlen(_b);
		if(blen>alen)
		{
			cout<<0<<endl;
			continue;
		}
		if(alen%2)
		{
			for(int i=0;i<=alen/2;i++)
			{
				int t = _a[i]-‘0‘;
				_a[i]=_a[alen-1-i]-‘0‘;
				_a[alen-1-i]=t;
			}
		}
		else
		{
			for(int i=0;i<alen/2;i++)
			{
				int t = _a[i]-‘0‘;
				_a[i]=_a[alen-1-i]-‘0‘;
				_a[alen-1-i]=t;
			}
		}
		if(blen%2)
		{
			for(int i=0;i<=blen/2;i++)
			{
				int t=_b[i]-‘0‘;
				_b[i]=_b[blen-1-i]-‘0‘;
				_b[blen-1-i]=t;
			}
		}
		else
		{
			for(int i=0;i<blen/2;i++)
			{
				int t=_b[i]-‘0‘;
				_b[i]=_b[blen-1-i]-‘0‘;
				_b[blen-1-i]=t;
			}
		}
		int a_b = alen-blen;
		for(int i=alen-1;i>=0;i--)
		{
			if(i>=a_b)
				_b[i]=_b[i-a_b];
			else
				_b[i]=0;
		}
		blen=alen;
		int temp;
		for(int i = 0 ; i<=a_b;i++)
		{
			while((temp = substract(_a,_b+i,alen,blen-i))>=0)
			{
				alen = temp;
				_c[a_b-i]++;
			}
		}
		int i=a_b;
		while(!_c[i]&&i>=0)
			i--;
		if(i>=0)
			for(i;i>=0;i--)
				cout<<_c[i];
		else
			cout<<0<<endl;
		cout<<endl;
	}
	return 0;
}

我的代码中没有注释 因为原作者中的代码注释很详细很仔细,大家可以去参考一下。

好了!

感谢自己坚持。

uva 1543 - Telescope(dp+几何)

时间: 2024-09-28 20:52:16

uva 1543 - Telescope(dp+几何)的相关文章

UVA 1543 - Telescope(dp+几何)

题目链接:1543 - Telescope 题意:按顺序给定圆周上一些点,问用选一些点组成m边形面积的最大值. 思路:dp,dp[i][j][k] 表示第一个点为i,最后一个点为j,当前选择k的最大值,因为多选一个点,会多的面积为他和第一个点和最后一个点构成的三角形面积,然后利用海伦公式求面积,状态转移为:dp[i][j][x] = max(dp[i][j][x], dp[i - 1][j][k] + s); 代码: #include <stdio.h> #include <string

UVA 10641 - Barisal Stadium(DP + 几何)

题目链接:10641 - Barisal Stadium 题意:逆时针给定n个点,在给m个灯,每个灯有一个花费,要求最小花费使得所有边能被灯照到 思路:用向量叉积判断向量的顺逆时针关系,从而预处理出每个灯能照到的边,然后由于n个点是环的,所以可以直接扩大两倍,dp时候去枚举起点即可 状态为dp[i]表示现在照到i条边之前的边全部照亮需要的最小花费 代码: #include <stdio.h> #include <string.h> const double eps = 1e-6;

uva 10641 - Barisal Stadium(dp+几何)

题目链接:uva 10641 - Barisal Stadium 题目大意:按照顺时针给出操场的周边点,然后给出周围可以建设照明灯的位置,以及在该位置建设照明灯的代价,照明灯照射的范围与操场的边界相切,现在要求一个最小的花费,要求操场的所有边都被照射到. 解题思路:dp[i][j]表示从第i个点到第j个点之间的边都被照射到的最小代价,这样转移方程也很好写,只要有某个等得照射范围有覆盖到i,j,就可以向外扩展. 然而现在最主要的问题是如何求各个点的照射范围,一开始我是用灯的位置和边界所有点求斜率,

uva 12723 概率dp

Dudu is a very starving possum. He currently stands in the first shelf of a fridge. This fridge iscomposed of N shelves, and each shelf has a number Qi (1 ≤ i ≤ N) of food. The top shelf, whereDudu is, is identified by the number 1, and the lowest is

uva 11133 - Eigensequence(dp)

题目链接:uva 11133 - Eigensequence 题目大意:给定一个序列a,能够确定一个序列b,要求: 1)b[1]=a[1] 2)a[j?1]<b[j]≤a[j]且b[j]a[j]?a[j?1]为整数,j>1的时候 假设对于每一个ai=bi,则称b序列为Eigensequence序列. 如今给定a1和an,问有多少个Eigensequence序列. 解题思路:dp[i][j]表示第i个数为j的情况有多少种,假设k整除k-j,dp[i+1][k]+=dp[i][j]. #inclu

uva 11367 dijkstra+dp状态压缩

题意:给出n个地点 和 每个地点的油价 ,有 m 条边 , 并给出每条边长度 .1单位汽油可以走1千米  , 油箱的容量为 c , 在初始点 s 时 , 油箱中的油为 0 , 求s 到 t 的最小花费 . 解法: 定义 状态 d[i][j] 表示到达 地点 i 且油箱中有 j 单位油时的最小 花费. 对于状态的转移时 , 有两种方法: 1.把每个点的所有状态都求出 2.不把每个点的状态都求出 , 而是一单位一单位的加油. 对于第一种方法 , 会超时 , 因为每个点的状态太多 , 但是能用的状态就

uva 10593 - Kites(dp)

题目链接:uva 10593 - Kites 题目大意:给出一个n*n的图,表示一张纸板,问有多少种方法做成风筝,风筝必须是正方形或者是菱形,并且不能有洞. 解题思路:分正方形和菱形两种情况讨论: 正方形,dp[i][j]表示以i,j为右下角的正方形 dp[i][j]=min(dp[i?1][j],dp[i][j?1]) 并且如果黄色部分也为'x'的话,dp[i][j]++ 菱形,dp[i][j]表示菱形的正下角 同样地市黄色部分如果为'x'的话,dp[i][j]++ #include <cst

uva 10237 - Bishops(dp)

克里斯·厄姆森 谷歌今天在 Code 大会上发布了新的无人驾驶汽车.该汽车看起来像是有轮子的缆车,它既没有驾驶盘,也没有刹车踏板和加速装置.Re/code 采访了谷歌无人驾驶汽车项目主管克里斯·厄姆森(Chris Urmson),期间谈及该项目革命背后的概念.产品何时上路等问题. 谷歌在过去的 5 年里改装了现成车型去试验无人驾驶技术.除了车顶的旋转激光装置外,它们看上去跟普通车没什么不同.而该公司今天发布的汽车看上去则非常怪异.它们又小又圆,配备各种小型黑色传感器(车顶也有旋转激光装置),用泡

CUGBACM_Summer_Tranning3 2013长沙现场赛(二分+bfs模拟+DP+几何)

A题:二分 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 用lower_bound可以轻松解决,不过比赛的时候逗逼了. 刚开始没有预处理,所以队友给出一组数据的时候没通过,然后一时紧张又想不出什么好的解决办法,所以就没再继续敲代码.实在有点可惜了. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #includ