uva 465 - Overflow 大数加法 大数乘法
2013-08-02 22:49
423 查看
需要的知识就是大数加法和乘法 做了后才知道模版的正确性很重要啊 适用性也很重要 所以自己也下定决心写一写大数的四则运算的模版
还有一点也很重要 就是最大的数是多少 刚开始把以为是无符号的最大数 弄了一会才发现是整形的最大值 在这Wrong 了一次 再次提醒注意审题
看了别人的代码和解题思想 才知道自己还是太嫩了 努力学吧
zcube的博客 强烈建议去看 http://blog.csdn.net/zcube/article/details/8458888
下面看我的代码 写得非常的搓
还有一点也很重要 就是最大的数是多少 刚开始把以为是无符号的最大数 弄了一会才发现是整形的最大值 在这Wrong 了一次 再次提醒注意审题
看了别人的代码和解题思想 才知道自己还是太嫩了 努力学吧
zcube的博客 强烈建议去看 http://blog.csdn.net/zcube/article/details/8458888
下面看我的代码 写得非常的搓
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; char t[10005]; char s[11]="2147483647";//无符号整形的最大数 int t_len,s_len = 10; int zero(char *l)//去掉前导零 { int i; for(i = 0; l[i]=='0' ;i++); return i; } /*返回1这个数比无符号整形大 返回0这个数比无符号整形小*/ int Compare(char *q) { int zero_len = zero(q); int q_len = strlen(q); if(q_len-zero_len > s_len)return 1; if(s_len > q_len-zero_len)return 0; //长度相等比较每位数 for(int i = zero_len; i < q_len; i++) if(s[i]<q[i])return 1; else if(s[i]>q[i])return 0; return 0; } int Count(char *a,int a_len,char *b,int b_len ) { char str[10005]; memset(str,0,sizeof(str)); int str_len = 0; int sum = 0,i; if(a_len == b_len) { for(i = 0; i < a_len; i++ ) { sum += (a[i]-'0')+b[i]-'0'; str[str_len++] = sum%10+'0'; sum /= 10; } } else if(a_len > b_len) { for(i = 0; i < b_len; i++ ) { sum += (a[i]-'0')+b[i]-'0'; str[str_len++] = sum%10+'0'; sum /= 10; } for(;i < a_len; i++) { sum += (a[i]-'0'); str[str_len++] = sum%10+'0'; sum /= 10; } } else { for(i = 0; i < a_len; i++ ) { sum += (a[i]-'0')+b[i]-'0'; str[str_len++] = sum%10+'0'; sum =sum / 10; } for(;i < b_len; i++) { sum += b[i]-'0'; str[str_len++] = sum%10+'0'; sum /= 10; } } if(sum) str[str_len++] = sum+'0'; str[str_len]='\0'; //计算出结果后顺序存在t数组中 t_len = 0; for(int i = str_len-1; i >= 0; i--) t[t_len++]=str[i]; t[t_len]='\0'; return Compare(t); } int multi(char *a,int a_len,char *b,int b_len) { int str[10005]; memset(str,0,sizeof(str)); int str_len = 0,i,j; for(i = 0; i < a_len; i++) for(j = 0; j < b_len; j++) str[i+j] += (a[i]-'0')*(b[j]-'0'); int sum = 0; for(i = 0; i < a_len+b_len; i++) { sum += str[i]; str[i] = sum%10; sum /= 10; } for(i = a_len+b_len; i >=0&&str[i]==0;i--); str_len = i+1; //计算出结果后顺序存在t数组中 t_len = 0; for(int i = str_len-1; i >= 0; i--) t[t_len++]=str[i]+'0'; if(i == -1)t[t_len++] = '0'; t[t_len]='\0'; return Compare(t); } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL char p[10005], q[10005],m[10005],n[10005], c; int ok[2],result =0,y = 1; while(y) { memset(q,0,sizeof(q)); memset(p,0,sizeof(p)); if(scanf("%s %c %s",p,&c,q)==EOF)break; getchar(); result = 0; ok[0] = Compare(p); ok[1] = Compare(q); printf("%s %c %s\n",p,c,q); memset(m,0,sizeof(m)); memset(n,0,sizeof(n)); int q_len = strlen(q),p_len = strlen(p); int m_len = 0, n_len = 0; for(int i = q_len-1; i >= 0; i--) m[m_len++]=q[i]; m[m_len]='\0'; for(int i = p_len-1; i >= 0; i--) n[n_len++]=p[i]; n[n_len]='\0'; if(c=='+')result = Count(m,m_len,n,n_len); else result = multi(m,m_len,n,n_len); if(ok[0]) printf("first number too big\n"); if(ok[1]) printf("second number too big\n"); if(result) printf("result too big\n"); } }
相关文章推荐
- UVA 465 Overflow 高精度加法乘法(误!。其实应该说是浮点数的优势。。。)
- △UVA465 - Overflow(判断大数相加相乘是否会溢出)
- uva 10523 Very Easy !!! 大数模拟加法和乘法
- UVA 465 - Overflow(大数)
- Uva 12333 Revenge of Fibonacci (字典树 + 大数加法运算)
- 大数加法和大数乘法模板函数
- UVa - 465 - Overflow
- 大数加法、大数乘法、大数减法。Swift。
- nefu 120 Lucas-Lehmer 梅森素数判别法 二分-大数乘法换加法
- 大数加法乘法
- UVA - 465 Overflow
- UVa 465 - Overflow
- 大数运算——加法,减法,乘法 .
- UVA 10106 Product(大数乘法)
- UVA_465_Overflow
- 高精度 大数加法 乘法 除法 模板
- 大数加法 及 乘法
- nefu 120 Lucas-Lehmer 梅森素数判别法 二分-大数乘法换加法
- uva 10106 Product(大数乘法)
- UVa 465 Overflow (比较大小难道不应该用double吗)