大数加减乘除
发布时间:2020-12-14 02:46:40 所属栏目:大数据 来源:网络整理
导读:/* 模板 大数乘小数 */#include stdio.h#include string.h#define N 1000char* Mul(char a[],char b[]){int lena = strlen(a);int lenb = strlen(b);char ans[N];int ni,jw = 0,start = 0;memset(ans,'0',sizeof(ans));for(int i = lena - 1; i = 0; i --){/
/* 模板 大数乘小数 */ #include <stdio.h> #include <string.h> #define N 1000 char* Mul(char a[],char b[]){ int lena = strlen(a); int lenb = strlen(b); char ans[N]; int ni,jw = 0,start = 0; memset(ans,'0',sizeof(ans)); for(int i = lena - 1; i >= 0; i --){ // 完全仿照平时数学乘法笔算方法 ni = start ++; // start 为这轮计算保存结果的起始位置;如 123*43 第一轮算123 *3,起始位置为0,第二轮算123*4(其实*40),起始位置为1 // 易知,start 每轮运算后应加1 for(int j = lenb - 1; j >= 0; j --){ jw = jw + (a[i] - '0') * (b[j] - '0') + ans[ni] - '0'; // jw暂存结果 ans[ni ++] = jw % 10 + '0'; // jw % 10 后写入ans数组 jw /= 10; // jw / 10 后才是真正的进位 } while(jw){ // 本轮计算完成后,还有进位,将其写入ans数组 ans[ni ++] = jw % 10 + '0'; jw /= 10; } } ans[ni] = ' '; for(int i = 0; i < ni / 2; i ++){ // 因为是逆序写入的,最后要反转 char temp = ans[i]; ans[i] = ans[ni - i - 1]; ans[ni - i - 1] = temp; } return ans; } int main() { char a[N],b[N]; while(scanf(" %s %s",a,b) != EOF){ printf("%sn",Mul(a,b)); } return 0; } /* 模板 大数乘小数 */ #include <stdio.h> #include <string.h> #define N 1000 char* Mul(char a[],int b){ // 直接拿大数的每一位去乘小数,注意进位即可 int lena = strlen(a); char ans[N] = {" "}; // 保存结果 int ni = 0,jw = 0; // ni为结果数组下表, jw保存进位 for(int i = lena - 1; i >= 0; i --){ // 拿大数的每一位去成小数然后加上低位进位,结果%10后保存在ans数组,结果/10 作为进位 jw = jw + (a[i] - '0') * b; ans[ni ++] = jw % 10 + '0'; jw /= 10; } while(jw){ // jw不为0,仍要取余保存 ans[ni ++] = jw % 10 + '0'; jw /= 10; } ans[ni] = ' '; for(int i = 0; i <= ni / 2; i ++){ // 结果数组倒置 char temp = ans[i]; ans[i] = ans[ni - i - 1]; ans[ni - i- 1] = temp; } return ans; } int main() { int b; char a[N]; while(scanf(" %s %d",&b) != EOF){ printf("%sn",b)); } return 0; } /* 模板 大数加大数 */ #include <stdio.h> #include <string.h> #define N 1000 char* Add(char a[],char b[]){ // 完全模拟数学运算习惯 int lena = strlen(a); int lenb = strlen(b); char ans[N]= {" "}; // 保存运算结果 int i = 0,jw = 0; // i为ans数组下标,jw 即保存低位运算后的进位 while(lena -- && lenb --){ // 从最低位开始 相加 jw = jw + a[lena] + b[lenb] - '0' * 2; ans[i ++] = jw % 10 + '0'; jw /= 10; } while(lena >= 0){ // 将单独剩余高位加上 jw = jw + a[lena --] - '0'; ans[i ++] = jw % 10 + '0'; jw /= 10; } while(lenb >= 0){ jw = jw + b[lenb --] - '0'; ans[i ++] = jw % 10 + '0'; jw /= 10; } while(jw){ // 进位不为0的话,加上进位 ans[i ++] = jw % 10 + '0'; jw /= 10; } for(int j = 0; j <= i / 2; j ++){ // 结果数组倒置 char temp = ans[j]; ans[j] = ans[i - j - 1]; ans[i - j - 1] = temp; } return ans; } int main() { char a[N],b[N]; while(scanf("%s %s",Add(a,b)); } return 0; } /* 模板 — 大数减大数 */ #include <stdio.h> #include <string.h> #define N 1000 char* Mul(char a[],char b[]){ char ans[N]; int lena = strlen(a); int lenb = strlen(b); int ni = N - 2,ok = 0; // ni为ans数组下标,计算结果倒叙存入 ans[ni + 1] = ' '; if(lena < lenb || lena == lenb && strcmp(a,b) < 0){ // 判断结果是不是负数 ok = -1; char ls[N]; int temp = lena; // 交换变量 lena = lenb; lenb = temp; strcpy(ls,a); strcpy(a,b); strcpy(b,ls); } int i,j,ls,jw = 0; // jw 保存借位 for(i = lena - 1,j = lenb - 1; i >= 0 && j >= 0; i --,j --){ // 从最低位开始相减 ls = a[i] - b[j] - jw; // ls 临时保存结果 if(ls < 0){ ls += 10; // 借位 jw = 1; } else{ jw = 0; } ans[ni --] = ls + '0'; } while(i >= 0){ ls = a[i --] - '0' - jw; if(ls < 0){ ls += 10; // 借位 jw = 1; } else{ jw = 0; } ans[ni --] = ls + '0'; } while(ans[ni + 1] == '0' && ans[ni + 2] != ' '){ // 除去前导0 ni ++; } if(ok){ ans[ni --] = '-'; } return ans + ni + 1; } int main() { char a[N],b)); } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |