465 - Overflow

来源:互联网 发布:免费自动发卡平台源码 编辑:程序博客网 时间:2024/05/22 06:15

题目:465 - Overflow


题目大意: 高精度数的加法和乘法 ,判断输入的两个数和结果是超过int型的范围;

解题思路:用到atof 将字符串转换成浮点数;还有begin 高精度运算类模板;


#include<iostream>#include<stdio.h>#include<string.h>#include <stdlib.h>using namespace std;const int N = 10000;struct begin {int len;char s[N];begin() {len = 1;memset(s, 0 ,sizeof(s));}begin operator = (const char *s1);begin operator + (const begin &b);begin operator * (const begin & b);begin operator += (const begin & b);};begin begin::operator =(const char * s1) {len = strlen(s1);for (int i = 0; i < len ; i++) {s[i] = s1[len - 1 - i] - '0';}return * this ;}begin begin::operator +(const begin & b) {begin c;c.len = 0;int l = (len > b.len) ? len : b.len, i, a = 0;for (i = 0; i < l || a; i++) {a = a + s[i] + b.s[i];c.s[i] = a % 10;a = a / 10;}c.len = i;return c;}begin begin::operator +=(const begin& b) {*this = * this + b;return * this;}begin begin::operator *(const begin & b) {begin c;c.len = 0;begin sum;sum.len = 0;int i, j, k, a = 0;for (i = 0; i < b.len; i++) {for (k = i, j = 0; j < len || a; j++, k++) {a = a + s[j] * b.s[i]; c.s[k] = a % 10 ;a = a / 10 ;}c.len = j + i;sum += c;memset(c.s, 0, sizeof(c.s));}return sum;}int main() {char s[3][N], ch;begin a, b, c;int i, j;double t = 2147483647 , d;while(scanf("%s%*c", & s[0]) != EOF && scanf("%c%*c", &ch) != EOF && scanf("%s%*c", & s[1]) != EOF) {a = s[0];b = s[1];if(ch == '+')c = a + b;else if(ch == '*') {int l1 = strlen(s[0]);int l2 = strlen(s[1]);if(l1 > l2) c = a * b;else c = b * a;}printf("%s %c %s\n", s[0], ch, s[1]);d = atof(s[0]);if(d > t)printf("first number too big\n");d = atof(s[1]);if(d > t)printf("second number too big\n");for( i = c.len - 1, j = 0; i >= 0; i--, j++)s[2][j] = c.s[i] + '0';s[2][j] = '\0';//printf("%s\n",s[2]);d = atof(s[2]);if(d > t)printf("result too big\n");memset(a.s, 0, sizeof(a.s));memset(b.s, 0, sizeof(b.s));memset(c.s, 0, sizeof(c.s));memset(s[2], 0, sizeof(s[2]));}return 0;}


0 0