九度oj 1037 Powerful Calculator 高精度算法
来源:互联网 发布:vscode 运行nodejs 编辑:程序博客网 时间:2024/05/29 17:26
http://ac.jobdu.com/problem.php?pid=1037
高精度运算加,减,乘。并且带有符号。
//高精度算法,400位以内的加,减,乘。#include <stdio.h>#include <string.h>//add funcvoid add(int *a, int lena, int *b, int lenb, int *t, int &lent){ int i, j, k = 0; for(i = 0, j = 0; i < lena && j < lenb; i ++, j ++){ t[k ++] = a[i] + b[j]; } while(i < lena){ t[k ++] = a[i ++]; } while(j < lenb){ t[k ++] = b[j ++]; } j = 0; for(i = 0; i < k; i ++){ t[i] += j; j = t[i]/10; t[i] %= 10; } while(j != 0){ t[k ++] = j % 10; j /= 10; } lent = k;}//sub funcvoid sub(int *a, int lena, int *b, int lenb, int *t, int &lent){ int i, j = 0, k = 0; for(i = 0; i < lenb; i ++){ t[i] = a[i] - b[i]; } k = i; while(i < lena){ t[k ++] = a[i ++]; } for(i = 0; i < k; i ++){ t[i] += j; if(t[i] < 0){ j = -1; t[i] += 10; } else { j = 0; } } while(t[k - 1] == 0){ k --; } lent = k;}//numti funcvoid multi(int *a, int lena, int *b, int lenb, int *t, int &lent){ int i, j, k = 0; for(i = 0; i < lena; i ++){ for(j = 0; j < lenb; j ++){ t[i + j] += a[i] * b[j]; } } k = i + j - 1;/* for(i = 0; i < k; i ++){ printf("%d ", t[i]); } printf("\n");*/ j = 0; for(i = 0; i < k; i ++){ t[i] += j; j = t[i] / 10; t[i] %= 10; } while(j != 0){ t[k ++] = j % 10; j /= 10; } lent = k;}//chang char * to int * and return the lenth and signalvoid getnum(char *str, int *a, int &lena, char &op){ int len = strlen(str); int i, t = 0; if(str[0] == '-')op = '-'; else op = '+'; for(i = len - 1; i >= 1; i --){ a[t ++] = (int)(str[i] - '0'); } if(str[0] != '-' && str[0] != '+')a[t ++] = (int)(str[0] - '0'); lena = t;}int main(){// freopen("input.in", "r", stdin); char str[450], str2[450], op, op2; int num[450], num2[450]; int ares[450], sres[450], mres[900]; int lennum, lennum2, lena, lens, lenm; int i; while(gets(str)){ gets(str2); lennum = strlen(str); lennum2 = strlen(str2); getnum(str, num, lennum, op); getnum(str2, num2, lennum2, op2); /* add(num, lennum, num2, lennum2, ares, lena); printf("%d\n", lena); for(i = lena - 1; i >= 0; i --){ printf("%d", ares[i]); } printf("\n"); if(lennum > lennum2){ sub(num, lennum, num2, lennum2, sres, lens); printf("%d\n", lens); for(i = lens - 1; i >= 0; i --){ printf("%d", sres[i]); } printf("\n"); }*/ if(op == op2){ //add add(num, lennum, num2, lennum2, ares, lena); if(op == '-')printf("-"); for(i = lena - 1; i >= 0; i --){ printf("%d", ares[i]); } printf("\n"); //sub if(lennum > lennum2){ sub(num, lennum, num2, lennum2, sres, lens); if(op == '-')printf("-"); for(i = lens - 1; i >= 0; i --){ printf("%d", sres[i]); } printf("\n"); }//if else if(lennum < lennum2){ sub(num2, lennum2, num, lennum, sres, lens); if(op == '+')printf("-"); for(i = lens - 1; i >= 0; i --){ printf("%d", sres[i]); } printf("\n"); }//else if else{ for(i = lennum - 1; i >= 0; i --){ if(num[i] != num2[i])break; } if(i < 0)printf("0\n"); else if(num[i] > num2[i]){ sub(num, lennum, num2, lennum2, sres, lens); if(op == '-')printf("-"); for(i = lens - 1; i >= 0; i --){ printf("%d", sres[i]); } printf("\n"); } else{ sub(num2, lennum2, num, lennum, sres, lens); if(op == '+')printf("-"); for(i = lens - 1; i >= 0; i --){ printf("%d", sres[i]); } printf("\n"); }//else }//else }//if else{ //add if(lennum > lennum2){ sub(num, lennum, num2, lennum2, ares, lena); if(op == '-')printf("-"); for(i = lena - 1; i >= 0; i --){ printf("%d", ares[i]); } printf("\n"); }//if else if(lennum < lennum2){ sub(num2, lennum2, num, lennum, ares, lena); if(op == '+')printf("-"); for(i = lena - 1; i >= 0; i --){ printf("%d", ares[i]); } printf("\n"); }//else if else{ for(i = lennum - 1; i >= 0; i --){ if(num[i] != num2[i])break; } if(i < 0)printf("0\n"); else if(num[i] > num2[i]){ sub(num, lennum, num2, lennum2, ares, lena); if(op == '-')printf("-"); for(i = lena - 1; i >= 0; i --){ printf("%d", ares[i]); } printf("\n"); } else{ sub(num2, lennum2, num, lennum, ares, lena); if(op == '+')printf("-"); for(i = lena - 1; i >= 0; i --){ printf("%d", ares[i]); } printf("\n"); }//else }//else //sub add(num, lennum, num2, lennum2, sres, lens); if(op == '-')printf("-"); for(i = lens - 1; i >= 0; i --){ printf("%d", sres[i]); } printf("\n"); } memset(mres, 0, sizeof(mres)); multi(num, lennum, num2, lennum2, mres, lenm); if(op != op2)printf("-"); for(i = lenm - 1; i >= 0; i --){ printf("%d", mres[i]); } printf("\n"); } return 0;}
- 九度oj 1037 Powerful Calculator 高精度算法
- 九度 oj 题目1037:Powerful Calculator
- 九度OJ 1037 Powerful Calculator
- 九度oj-1037-Powerful Calculator
- 九度 oj 题目1037:Powerful Calculator
- 九度[1037]-Powerful Calculator
- 【九度】题目1037:Powerful Calculator
- 九度OJ 1037:Powerful Calculator(强大的计算器) (大整数运算)
- 题目1037:Powerful Calculator
- 题目1037:Powerful Calculator
- 题目1037:Powerful Calculator
- 题目1037:Powerful Calculator
- 题目1037:Powerful Calculator
- 题目1037:Powerful Calculator
- 九度OJ-1198 高精度整数计算
- 九度 OJ 1198 高精度加法
- OJ_1037 Powerful Calculator
- 1037.Powerful Calculator
- 一只5号电池是2300MAH 那如果用一对的时候就能说是4600MAH了吗??
- 3.5 类的“递归”关系与“三角”关系 类图, UML
- JAVA并发编程学习笔记之AQS源码分析(获取与释放)
- Spinner样式大全(1)
- VS 常用快捷键
- 九度oj 1037 Powerful Calculator 高精度算法
- 修改android项目sdk版本的方法
- Cocos2D-iPhone编程中按钮的设置(MenuItem类系的介绍)
- 基于LTC6802的锂电池组均衡电路设计
- 设计webview阴影部分
- 10个管理工作时间的小技巧
- 利用TortoiseSVN获取最新版本的OpenCV源码
- 学会精力管理 让你事半功倍
- poj 2027 No Brainer