大数的四则运算 与浮点数的优势
发布时间:2020-12-14 04:03:14 所属栏目:大数据 来源:网络整理
导读:下面是自己这几天做大数题目的总结 ?当中有错的不足的地方还望指出来 ? 持续修改中。。。 ? 文章末尾有代码 听说有些大数题目可以利用double的优势解决(当然测试数据弱了) ?很牛是吧 ?我也感觉很牛 ?别问我 ?我现在也不知道 ?我正在学呢。。。 大数的四则
下面是自己这几天做大数题目的总结 ?当中有错的不足的地方还望指出来 ? 持续修改中。。。 ? 文章末尾有代码
听说有些大数题目可以利用double的优势解决(当然测试数据弱了) ?很牛是吧 ?我也感觉很牛 ?别问我 ?我现在也不知道 ?我正在学呢。。。 整数 浮点数 (浮点数类似整数的运算 我的做法记录小数点的位置 同样的把数字逆序存储后计算 这样就可以知道到时候小数点应该出现在结果的什么位置了) 大数正整数的四则运算步骤 1:加法: (1)逆序存储输入的数据 (2)调用Count(char *a,cahr *b,char *str)函数 ?进行加法计算 ?返回计算结果字符串 (3)调用print()输出函数 ?根据要求判断是否要输出前导零 ?适当的修改输出函数 ? ? 2:乘法: (1)逆序存储输入的数据 ? (2)调用multi(char *a,char *b,char *str)函数 ?进行乘法计算 ?返回计算结果字符串 (3)调用print()输出函数 ?根据要求判断是否要输出前导零 ?适当的修改输出函数 3:减法:待更新。。 4:除法:待更新。。 注意: 1:输入数据太大的话模拟四则运算的方法会超时(目前没有找到解决方法 ?找到了再更新) 2:大数的大小比较: (1)去掉前导零 (2)长度比较 ?长度小的自然就小 ? 长度相等从最高位开始比较 ?? 3:输入与输出: 输入:可以有前导0 输出: (1)保留前导零 (2)去掉前导零 (乘法不去前导零的时候我感觉非常的蛋疼 因为不知道怎么保留啊 ?其实,到时候看具体情况修改一下就行了 也不难写 ? 我下面写的代码是保存输入最多位数的前导零 ?? 比如 ? ?? 2222222222111100 * ?000000000000 = 0000000000000000 所以说这很蛋疼啊!)4:要是结果是零且要去掉前导零的时候千万要输出0啊 ?别什么都没输出 5: 待更新。。 #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; void print(char *str,int str_len) { int i = str_len-1,ok = 1; //for(i = str_len-1; str[i] == '0'; i--);//加上这条输出时去掉前导零 实际的str字符串并没有改变 for( ;i >= 0; i--) { printf("%c",str[i]); ok = 0; } if(ok&&i == -1)printf("0"); printf("n"); } int zero(char *l)//返回前导零的个数注意 字符串是顺序存储的 { int i; for(i = 0; l[i]=='0' ;i++); return i; } /*返回1:q比p大 返回0:p比q大*/ int Compare(char *q,char *p)//这的数一定要是顺序存储的 { int q_zero = zero(q); int q_len = strlen(q); int p_zero = zero(p); int p_len = strlen(p); if(q_len-q_zero > p_len - p_zero)return 1; if(p_len - p_zero > q_len- q_zero)return 0; //长度相等比较每位数 for(; q_zero < q_len; q_zero++,p_zero++) if(p[p_zero]<q[q_zero])return 1; else if(p[p_zero]>q[q_zero])return 0; return 0; } void re_order(char *p,int p_len,char *q)//逆序存储p到q中 { int q_len = 0; for(int i = p_len-1; i >= 0; i--) q[q_len++]=p[i]; q[q_len]=' '; } void Count(char *a,char *b,char *str) { int a_len = strlen(a); int b_len = strlen(b); int i,sum = 0; int str_len = 0; 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>0) str[str_len++] = sum+'0'; str[str_len]=' '; print(str,str_len); } void multi(char *a,char *str) { int a_len = strlen(a); int b_len = strlen(b); int num[1005]; memset(num,sizeof(num));//这一定要初始化为零 要不容易Wrong的 int i,j,num_len,str_len,sum; num_len = sum = 0; for(i = 0; i < a_len; i++) for(j = 0; j < b_len; j++) num[i+j] += (a[i]-'0')*(b[j]-'0');//最多有a_len+b_len 位 for(str_len = 0; str_len < a_len+b_len; str_len++) { sum += num[str_len]; str[str_len] = sum%10+'0'; sum /= 10; } //下面的操作是在计算的结果中保存最多的前导零 int maxn = max(a_len,b_len); printf("maxn=%d str_len = %dn",maxn,str_len); for( ; str[str_len-1] == '0'; str_len--); if(str_len < maxn) for(;str_len < maxn; str_len++)str[str_len] = '0'; str[str_len]=' '; print(str,str_len); } int main() { #ifdef LOCAL freopen("in1.txt","r",stdin); #endif // LOCAL char q[1005],p[1005],n[1005],m[1005]; char str[1005];//用来保存计算的结果 while(gets(q)!=NULL) { gets(p); puts(q); puts(p); int q_len = strlen(q),p_len = strlen(p); re_order(q,q_len,m); re_order(p,p_len,n); //Count(m,n,str); multi(m,str); printf("n"); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |