UVa 202 大数除法

背景:1_WA:忘了每个答案之间有一个空白行!2_WA:没看见等号左右两边都有空格!!!!!!!!

思路:整数和小数分开来求,整数部分直接用整型除法,小数部分:分子=(分子%分母)*10.并且把每个分子储存在str[0]中,当出现已经出现过的分子时,小数部分开始循环!

学习:

1.巢鸽原理(抽屉原理,狄利克雷原则):

简单的描述:如果有n个笼子,n+1只鸽子居住,则至少有一个笼子有两只鸽子。

一般化的描述(用高斯函数来叙述):将n个元素分到m个集合中,至少有一个集合中元素个数大于等于[(n-1)/m]+1 。

对于本题,a%b最多有b-1个情况,根据巢鸽原理,循环节数小于等于b-1.

#include<stdio.h>
int str[2][10000];
int main(void){
	  int a,b,intger;
	  while(scanf("%d %d",&a,&b)!=EOF){
	  	int count=0,start,aa=a;
	  	intger=a/b;
	  	a=a%b;
	  	while(1){
	  		a*=10;
	  		for(int i=0;i < count;i++){
	  			if(a==str[0][i]){
	  				start=i;
            goto l1;
	  			}
	  		}
	  		str[0][count]=a;
	  		str[1][count++]=a/b;
	  		a=a%b;
	  	}
l1:   printf("%d/%d = %d.",aa,b,intger);
      for(int i=0;i < start;i++){
      	printf("%d",str[1][i]);
      }
      if(count<=50){
      	printf("(");
      	for(int i=start;i < count;i++){
      		printf("%d",str[1][i]);
      	}
      	printf(")\n");
      }else{
      	printf("(");
      	for(int i=start;i < start+50;i++){
      		printf("%d",str[1][i]);
      	}
      	printf("...)\n");
      }
      printf("   %d = number of digits in repeating cycle\n\n",count-start);
	  }
	  return 0;
} 
时间: 2025-01-02 00:00:29

UVa 202 大数除法的相关文章

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

组合数学 + 大数乘法 + 大数除法 之 hdu 1261 字串数

//  [3/17/2015 JmingS] /* 此题可直接推导出公式: {(A1+A2+……+An)!} / {A1!A2!……An!} 由于 (12×26)! = 312! 只能通过数组来存储,所以又涉及『大数乘法』和『大数除法』, 大数实现的主要思想模拟手算,具体参考程序. */ 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstdio> 4 #include <cstring> 5

51 Nod 1029 大数除法【Java大数乱搞】

1029 大数除法 基准时间限制:4 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给出2个大整数A,B,计算A / B和A Mod B的结果. Input 第1行:大数A 第2行:大数B (A,B的长度 <= 100000,A,B >= 0) Output 第1行:A / B 第2行:A Mod B (A % B) Input示例 987654321 1234 Output示例 800368 209 题目链接:http://www.51nod.com/onlineJud

uva 202 Repeating Decimals 模拟

弱校连萌题目链接:http://acm.bnu.edu.cn/v3/contest_show.php?cid=5772#problem/G 需要先想到出现循环节意味着出现了以前出现过的余数 然后就自己手写一个大数除法 后来看别人博客发现其实不用STL也可以 检查余数是否出现过可以是常数级的 因为除数不大于3000 所以开一个3010的数组来存余数标记即可 当然我还是用的map 因为复杂度实在太松了 这题烦得很 注意“输出前50位”是指所有数字加起来50位... 不是小数点后50位...(哭晕在厕

二进制转换 ——大数除法

1132: 数据结构习题--使用栈实现进制转换 时间限制: 1 Sec  内存限制: 128 MB 提交: 15  解决: 9 [提交][状态][讨论版] 题目描述 使用栈将一个很长(>30)的十进制数转换为二进制数 输入 若干个很长的十进制数 每行一个 输出 转换为二进制,每行输出一个 样例输入 123456789012345678901234567890 753951684269875454652589568545854758545824 样例输出 110001110111010010000

关于大数除法

最近在九度oj上看了几个关于大数的问题,特意在这里总结一番. 要知道我们要将一个1000多位的十进制数转换为二进制数,是没有哪个类型能装得下的,所以在这里我们的手动模拟辗转相除法.实现将一个很长的十进制数字符串转换成二进制的字符数组. 首先我们来看看这些int,long等等的取值范围,明白它们到底可以存多大,我们才能放心到底什么时候可以用,什么时候不可以用. 数据类型名称 字节数 别名 取值范围 int * signed,signed int 由操作系统决定,即与操作系统的"字长"有关 unsi

高精度之大数除法

大数除法说的比较少或许不像加法减法那样简单,或许是用的不太多.到底怎么我也不知道. 反正你会了加法减法,乘法而不会除法,就像是,打开电脑而不玩游戏,心里难受. 我是从看到了大神博客后学习了一下. http://blog.csdn.net/hitwhylz/article/details/9700935 博客中讲的很详细 让人一看就懂,我很佩服这位同学.果断的关注了. 毕竟别人写的是别人的. 自己写的才是自己的 .于是我就捋了捋,模仿这写了一遍: 思想就是:用减法来代替除法,但是一次一次的减太慢,

大数除法(lld最多19位)

大数除法的核心:把除法运算转化为减法运算,根据除法运算的特点, 有两个大整数a和b,当a==b时,a/b==1,余数是0.(a!=0,b!=0) 当a>b时,a/b>=1,余数需要通过计算求得. 当a<b时,a/b=0,余数就是a. 以7546除23为例. 先减去23的100倍,就是2300,可以减3次,余下646.   此时商就是300: 然后646减去23的10倍,就是230,可以减2次,余下186.此时商就是320: 然后186减去23,可以减8次,此时商就是328. 特例 本题要

poj2325 大数除法+贪心

将输入的大数除以9 无法整除再除以 8,7,6,..2,如果可以整除就将除数记录,将商作为除数继续除9,8,...,3,2. 最后如果商为1 证明可以除尽 将被除过的数从小到大输出即可 #include<cstdio> #include<cstring> #define mem(a) memset(a,0,sizeof (a)) using namespace std; char s[1005], t[1005]; int bang[15], n; bool div(int p)