ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:19.72KB ,
资源ID:5978831      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5978831.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ACM必做50题的解题高精度.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ACM必做50题的解题高精度.docx

1、ACM必做50题的解题高精度POJ 1001 Exponentiation 高精度数的计算, 以前在网上看到过一个计算大数阶乘比如10000000!的算法, 总体思想就是将结果用数组保存起来, 然后将结果的每一位与乘数相乘, 当然还有进位. 有了这个算法的思想, 这个题思路就可以是:先将输入的小数转换成一个整数, 当然这个整数肯定能够用int类型的变量保存, 比如1.2345, 通过函数 removeDot()将它转化成12345, 然后利用大数阶乘的思想计算12345*12345.*12345, 最后的就是输出了, 这个要考虑的情况比较多, 因为这个也WA了5次才AC(笨的要死), 情况虽多

2、, 但不难.这道题是高精度计算的,不算很难,但是很繁琐,尤其是对输入输出的要求。被这道题搞了好久,耐心来,一点一点调试,总会成功的。#include#include#includeusing namespace std;char ans10;char res2205;_int64 ps;/有几位小数点int len;/长度,R的有效长度/计算c = b * avoid Multiply(char * b,int bt,char * a,int at,char * c) int i,j; int up=0; for(i=0;iat;+i) up=0; for(j=0;j=10) up=t/10;

3、 t=t%10; ci+j=t+48; if(j=(bt-1) ) ci+j+1=(up+48); else ci+j=t+48; up=0; int main() string str; int n; int i,j; int s,t; int pos; while(cinstrn) i=5; pos=str.find(.,0); if(pos=s;-i) if(stri=.) continue; ansj=stri; j+; len=j; strcpy(res0,ans); strcpy(res1,ans); for(i=2;i0) j=0; while(resdj=0) j+; if(p

4、s=L) printf(.); for(i=ps-1;i=j ;-i) if(i=L) printf(0); else printf(%c,res(n+1)%2i); else if(j=ps) for(i=L-1;i=ps;-i) printf(%c,res(n+1)%2i); else for(i=L-1;i=j ;-i) if(i=ps) printf(%c.,res(n+1)%2i); else printf(%c,res(n+1)%2i); else for(i=L-1;i=0;-i) printf(%c,res(n+1)%2i); printf(n); return 0;POJ 1

5、047 Round and Round We Go题意:输入一个数,要求判该数是否为循环数. 依次将该数分别于2到len(输入的数的位数)相乘,在乘的过程中,判断数发生了变化没有,如果发生了变化,则直接输出该数不是循环数,没有必要再继续乘下去,而如果是循环数,则一直需要乘下去.#include#include#include#includeusing namespace std;int num70;int ans70;char ss70;bool match70;int main() int i,j,k,len; bool flag; while(scanf(%s,ss)!=EOF) len=

6、strlen(ss); for(i=len-1,j=0;i=0;i-,j+) numj=ssi-0; for(i=2;i=len;i+) memset(ans,0,sizeof(ans); for(j=0;jlen;j+) /依次将该数与2到len之间的数相乘 ansj=numj*i; for(j=0;j=10) ansj+1+=ansj/10; ansj%=10; memset(match,0,sizeof(match); /match数组用来标记数的匹配情况 flag=true; for(j=0;jlen;j+) k=0; while(klen) if(ansk=numj&!matchk)

7、 /两数字相等且没有进行标记 matchk=true; break; k+; if(k=len) /此时说明相乘后的结果发生了改变 flag=false; break; if(!flag) printf(%s is not cyclicn,ss); break; if(flag) printf(%s is cyclicn,ss); system(pause); return 0;POJ 1131 Octal Fractions给定一个八进制的小数题目要求你把它转换为十进制小数,转换后小数的位数是转换前八进制小数位数的3倍且不输出末尾无意义的零(即后置零). 我采用的方法是乘10然后对8取整(现

8、在假设将p进制的小数转换为n进制,同样采用乘n取整:),每转换一位,都必须从最低位slen-1开始至小数的最高位(即小数点后的一位),每次计算积 g=aj*n+k(其中k为下一位积的进位),本位进位数 k=g/p,积在本位存入 sj=g%p;最后的整数k作为转换的一位存放于转换结果字符串中。#include#include#include#includeusing namespace std;char s120,s250,s320;int main()int i,t,j,k,g,l,len;while(scanf(%s,s1)!=EOF) l=strlen(s1); strcpy(s3,s1)

9、; len=3*(l-2); t=0; s20=0; s21=.; j=2; while(t1;i-) /从最低位开始采用乘10对8取整 g=(s1i-0)*10+k; k=g/8; s1i=g%8+0; s2j=k+0; j+; s2j=0; printf(%s 8 = ,s3); j-; while(s2j=0) /找出最后一个不为0的数的位置 j-; for(i=0;i=j;i+) /去掉后置0进行的输出 printf(%c,s2i); printf( 10n);system(pause);return 0;ACMPOJ 1503(Integer Inquiry)题目解析:水题一道。就是

10、大数加法,循环移位。注意输入数据有以 0 开头的整数,所以要用 strcmp 判断而不是直接判断 0 位是否为0。 #include #include using namespace std; int main() / 输出字符串至多为 100 个 100 位数的和,给 102 位,因为我不需要最后一位 0 作定位符 char m_Sum 102 ; / 初始化这 102 位为 0 memset( m_Sum, 48, 102 ); / 定位输出字符串的位置,用于加法。定位输出字符串的位置,用于进位 int m_Pos_Sum, m_Pos_Sum_Temp; / 输入字符串长度至多为 100

11、,给 101 位,因为我需要 0 位控制结束 char m_Input 101 ; / 输入字符串的长度 int m_Length_Input; while ( 1 ) / 初始化为 0 memset( m_Input, 0, 101 ); / 输入数据 scanf( %s, m_Input ); / 输入的数据有可能是以 0 开头的,不能直接判断 0 是否为 0,得用 strcmp if ( strcmp( m_Input, 0 ) = 0 ) break; else / 计算输入字符串的长度 m_Length_Input = strlen( m_Input ); / 定位输出字符串的位置至

12、最后一位,即 101 m_Pos_Sum = 101; / 从这个字符串的最低位开始加, m_Length_Input - 1 永远表示需要加的那一位 while ( m_Length_Input 0 ) / 做单个位置的加法,注意需减 48 m_Sum m_Pos_Sum += ( m_Input m_Length_Input - 1 - 48 ); / 定位进位位置 m_Pos_Sum_Temp = m_Pos_Sum; / 如果大于 9,需要进位,且是循环进位 while ( m_Sum m_Pos_Sum_Temp 9 ) / 这一位减 10,前一位加 1 m_Sum m_Pos_Su

13、m_Temp -= 10; m_Sum -m_Pos_Sum_Temp += 1; / 输入字符串与输出字符串均往前移 1 位 - m_Length_Input; - m_Pos_Sum; / 输出结果,先找到第一个不为 0 的位置 int m_Cycle; for ( m_Cycle = 0; m_Cycle 102; + m_Cycle ) if ( m_Sum m_Cycle != 0 ) break; / 从该位置起,输出后面所有 for( ; m_Cycle 102; + m_Cycle ) printf( %c, m_Sum m_Cycle ); printf( n ); syst

14、em( pause ); return 0; POJ 1504 Adding Reversed Numbers 水题 此题主要就是数字的前后倒置,这是解决问题的关键,当然可以用字符串进行计算,但是这样我认为会比较复杂(没有测试),所以我采取了另一种方法,具体见reverse函数!#includeint main() int reverse(int x); int cases,x1,x2,sum; scanf(%d,&cases); while(cases-) scanf(%d%d,&x1,&x2); sum=reverse(x1)+reverse(x2); printf(%dn,reverse

15、(sum); return 0;int reverse(int x) int b,sum=0; while(x!=0) b=x%10; x=x/10; sum=sum*10+b; return sum;poj1060(Sorting It All Out)拓扑排序问题。也可以用传递闭包做,但是还没有看,不会.最主要的是要理解好题意:where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, which

16、ever comes first,。意思就是依次输入各个relation,一旦发现可以确定拓扑序列则输出序列,后面的relations忽略(即使发现有矛盾);一旦发现有矛盾(即环),则输出,后面relations也忽略。这个题意我倒是一开始就理解了,但是有个简单的问题我没有想到,应该先判断是否有矛盾(环),等输完最后一个relations后再判断是否有多个拓扑序列。如果没有考虑到这一点对于一些样例输入是可以正确输出的,但是对于如下的样例输入则会输出Sorted sequence cannot be determined.(实际上应该输出Inconsistency found after 12

17、relations.):11 12KJBAEFDFGFHIGEIKJFAHFCCB再注意到这一点就可以避免错误了,应该就差不多能过了。#include using namespace std;class polypublic:poly(int N = 0) n = N; p = new intn*sizeof(int); for(int i=0; i=0; i-) pi = s.pi; while(!s.pn-1) n-; return *this;poly()if(p) delete p;void set(const poly &a, const poly &b) n = abs(a.n -

18、 b.n)+1; for(int i=0; in-1; i+) pi = 0; pn-1 = 1;friend poly operator*(const poly &a, const poly &b) poly d(a.n + b.n + 1); d.n = 1; int i, j; for(i=0; ia.n; i+) if(a.pi) for(j=0; j d.n-1) d.n = i+j+1; return d;friend poly operator-(const poly &a, const poly &b) poly d(max(a.n, b.n); for(int i=0; id

19、.n; i+) d.pi = (a.pi - b.pi)%2; if(d.pi (const poly &a, const poly &b) if(a.n b.n) return 1; if(a.n = b.n) for(int i=a.n-1; i=0; i-) if(a.pi b.pi) return 1; return 0;friend ostream & operator(ostream &out, const poly &s) cout =0; i-) cout (istream &in, poly &s) cin s.n; for(int i=s.n-1; i=0; i-) cin s.pi; return in;private:int n, *p;a(1001), b(1001), c(1001), d(2002), e(1001);int main()int t;cin t;while(t-) cin a b c; d = a*b; while(d c) e.set(d, c); d = d - c*e; cout d endl;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1