需要的知识就是大数加法和乘法 做了后才知道模版的正确性很重要啊 适用性也很重要 所以自己也下定决心写一写大数的四则运算的模版
还有一点也很重要 就是最大的数是多少 刚开始把以为是无符号的最大数 弄了一会才发现是整形的最大值 在这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");
}
}