uva 465 - Overflow 大数加法 大数乘法
发布时间:2020-12-14 04:03:18 所属栏目:大数据 来源:网络整理
导读:需要的知识就是大数加法和乘法 ? ? ? 做了后才知道模版的正确性很重要啊 ? ?适用性也很重要 ? 所以自己也下定决心写一写大数的四则运算的模版 ? 还有一点也很重要 ? 就是最大的数是多少 ? ?刚开始把以为是无符号的最大数 ? 弄了一会才发现是整形的最大值 ? ?
需要的知识就是大数加法和乘法 ? ? ? 做了后才知道模版的正确性很重要啊 ? ?适用性也很重要 ? 所以自己也下定决心写一写大数的四则运算的模版 ? 还有一点也很重要 ? 就是最大的数是多少 ? ?刚开始把以为是无符号的最大数 ? 弄了一会才发现是整形的最大值 ? ?在这Wrong 了一次 ? 再次提醒注意审题 看了别人的代码和解题思想 ?才知道自己还是太嫩了 ? ?努力学吧 ? zcube的博客 ? 强烈建议去看 ??http://www.voidcn.com/article/p-szdwpuqh-vp.html 下面看我的代码 ? ?写得非常的搓 #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,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]=' '; //计算出结果后顺序存在t数组中 t_len = 0; for(int i = str_len-1; i >= 0; i--) t[t_len++]=str[i]; t[t_len]=' '; return Compare(t); } int multi(char *a,int b_len) { int str[10005]; memset(str,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]=' '; 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,sizeof(q)); memset(p,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 %sn",c,q); memset(m,sizeof(m)); memset(n,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]=' '; for(int i = p_len-1; i >= 0; i--) n[n_len++]=p[i]; n[n_len]=' '; if(c=='+')result = Count(m,m_len,n,n_len); else result = multi(m,n_len); if(ok[0]) printf("first number too bign"); if(ok[1]) printf("second number too bign"); if(result) printf("result too bign"); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |