大数加减乘除

来源:互联网 发布:深圳中原成交数据 编辑:程序博客网 时间:2024/04/29 11:55
/* 模板 大数乘小数 */#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 --){// 完全仿照平时数学乘法笔算方法 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] = '\0';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("%s\n", Mul(a, b));}return 0;}
/* 模板 大数乘小数 */#include <stdio.h>#include <string.h>#define N 1000char* Mul(char a[], int b){// 直接拿大数的每一位去乘小数,注意进位即可 int lena = strlen(a);char ans[N] = {"\0"};// 保存结果 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] = '\0';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", a, &b) != EOF){printf("%s\n", Mul(a, b));}return 0;}

/* 模板 大数加大数*/#include <stdio.h>#include <string.h>#define N 1000char* Add(char a[], char b[]){// 完全模拟数学运算习惯 int lena = strlen(a);int lenb = strlen(b);char ans[N]= {"\0"};// 保存运算结果 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", a, b) != EOF){printf("%s\n", Add(a, b));}return 0;}
/* 模板 — 大数减大数*/#include <stdio.h>#include <string.h>#define N 1000char* 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] = '\0';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'){// 除去前导0 ni ++;}if(ok){ans[ni --] = '-';}return ans + ni + 1; }int main(){char a[N], b[N];while(scanf(" %s %s", a, b) != EOF){printf("%s\n", Mul(a, b));}return 0;}



1 0
原创粉丝点击