您的位置:首页 > 其它

uva 465 - Overflow 大数加法 大数乘法

2013-08-02 22:49 423 查看
需要的知识就是大数加法和乘法       做了后才知道模版的正确性很重要啊    适用性也很重要   所以自己也下定决心写一写大数的四则运算的模版  

还有一点也很重要   就是最大的数是多少    刚开始把以为是无符号的最大数   弄了一会才发现是整形的最大值    在这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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息