10494Uva(二)高精度运算 易错点
来源:互联网 发布:淘宝预热 编辑:程序博客网 时间:2024/06/16 18:27
其实bign()
{
len = 0;
memset(ints, 0, sizeof(ints));
}
bign::len应该设置为1 ,表示一个bign 的0;
{
len = 0;
memset(ints, 0, sizeof(ints));
}
bign::len应该设置为1 ,表示一个bign 的0;
否则bign * int 容易出错:g.ints[0] = this->ints[i]; 但下次循环时len仍为0,出错
#include<stdio.h> #include<string.h> struct bign { int ints[10000]; int len; bign& operator= (char* s) { len = strlen(s); memset(ints, 0, sizeof(ints)); for(int i = 0; i < len; i++) { ints[i] = s[len-1-i] - '0'; } return *this; } bign& operator= (int n) { char s[10001]; sprintf(s,"%d",n); *this = s; return *this; } bign() { len = 0; memset(ints, 0, sizeof(ints)); } bool isempty() { return len == 0; } bign(char* s) { *this = s; } bign(int n) { *this = n; } bool operator > (const bign& b) const { if(len > b.len) return true; else if(len < b.len) return false; else { for(int i = len-1; i >=0; i--) { if(ints[i] != b.ints[i]) return ints[i] > b.ints[i]; } return false; } } bool operator >= (const bign& b) const { return !(b > *this); } bool operator < (const bign& b) const { return b > *this; } bool operator <=(const bign& b)const { return !(*this > b); } bool operator !=(const bign& b)const { return *this >b || *this < b; } bool operator == (const bign& b)const { return *this <= b && *this >= b; } bign operator - (const bign& b)const { bign res; if(*this < b) return res; res = *this; for(int i = 0; i < len; i++) { res.ints[i] -= b.ints[i]; if(res.ints[i] < 0) { res.ints[i] +=10; res.ints[i+1]--; } } int i = res.len -1; for(;i>=0 && res.ints[i] ==0; i--) continue; if(i == -1) i++; res.len = i + 1; return res; } // bign operator* (int n) { char s[10010]; sprintf(s,"%d",n); bign res; int temp = 0; int i; for(i = 0; i < len; i++) //2.如果原来设置的len == 0,那么循环永远不会执行,temp也永远==0 { temp = n * this->ints[i] + temp; res.ints[i] = temp%10; temp /= 10; } //res.len = len; while(temp >0) { res.ints[i++] = temp%10; temp /= 10; //res.len++; } /* int j; for(j = len + strlen(s) ; j >=0 && res.ints[j] == 0; j--); if( j==-1) j++; res.len = j +1; /* printf("from *operator\n"); res.dis(); */ return res; } bign operator/ (const bign& b)const { bign res,g; int i = this->len-1; for(; i>=0 ;i--) { g = g *10; g.ints[0] = this->ints[i]; if(g.len == 0) g.len++; //1.len==0时,g =g*10 不会自动修改len /* printf("from / remains\n"); g.dis(); putchar('\n'); */ while(g >= b) { g = g - b; res.ints[i]++; } } int j; for(j = this->len-1; j >=0 && res.ints[j] == 0; j--); if( j==-1) j++; res.len = j +1; return res; } bign operator% (const bign& b)const { bign res,g; int i = this->len-1; for(; i>=0 ;i--) { g = g *10; g.ints[0] = this->ints[i]; if(g.len == 0) g.len++; while(g >= b) { g = g - b; //res.ints[i]++; } } int j; for(j = this->len-1; j >=0 && g.ints[j] == 0; j--); if( j==-1) j++; g.len = j +1; return g; } void dis() { for(int i = 0; i < len; i++) { printf("%d", ints[len-1-i]); } putchar('\n'); } }; void eatzero(char* s) { int i; for(i = 0; i < strlen(s) && s[i] =='0'; i++) continue; if(strlen(s) == i) i--; int len =0; for(int j =i; j < strlen(s); j++) { s[len++] = s[j]; } s[len] = '\0'; //printf("%s\n", s); } int main() { freopen("input.txt","r",stdin); char first[10100]; char sec[10100]; char sign; while(scanf("%s %c %s",first,&sign,&sec)==3) { eatzero(first); eatzero(sec); bign f = first; //f.dis(); bign s = sec; //s.dis(); bign temp; if(sign == '/') temp = f/s; else temp = f % s; temp.dis(); } }
0 0
- 10494Uva(二)高精度运算 易错点
- 10494Uva高精度运算
- UVA 10106 Product 高精度运算
- 高精度计算(二) /*高精度的加法运算*/
- (数组应用二:高精度运算4.2.2)UVA 10523 VERY EASY !!! (大数累加)
- Uva 748 Exponentiation (高精度幂运算)
- uva 10494(高精度)
- uva 10494 高精度除法
- UVA 465(高精度)
- UVA 10200 (高精度)
- 高精度运算(转)
- 大数(高精度)运算
- 高精度总结(高精度类和重载运算高精度阶乘)
- 大数减法 (高精度运算)
- 大数高精度运算(模板)
- 高精度运算(运算符重载)
- 大整数运算乘法(高精度运算)
- 大整数运算(高精度运算)
- 获取前台进程包名(ForegroundProcess)
- Ubuntu16.04安装mysql
- 响应式开发(四)-----Bootstrap CSS----------Bootstrap CSS概览和相关注意事项
- 最小公倍数,最大公约数C语言(全)
- iOS开发之数据转模型(runtime)
- 10494Uva(二)高精度运算 易错点
- md5加密
- android 权限
- vue-cli
- TextView滚动显示内容
- BZOJ2527Meteors
- 2017.1.14【初中部 GDKOI】模拟赛B组 Mooo Moo 题解
- Go-作用域
- 一张图让你看懂Exress & Koa