对一个超大数求余操作,但是求余前已经越界,怎么办?

happyboy16 2009-12-30 10:00:40
每行都类似于 128166730406392893,rsrch,1,Write,3193909248,28672,2274 的文本文件,
我使用 fgets(buffer,200,input) 从文本读入,
再使用 sscanf(buffer,"%lf,%[^,],%ld,%[^,],%lld,%ld,%lf",&time,pc,&device,ope,&lsn,&size,&pro);分别赋给每个变量。
现在的问题是第五个变量lsn越界了,因为3193909248已经超过unsigned long int的最大值。
我对lsn这个变量的处理很简单,只需要将其从文本读入后,与6291456取余操作即可:lsn=lsn%6291456。但是lsn在读入时就越界了,所以结果不对,请问各位大侠,这个问题如何解决?感谢感谢!
...全文
511 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
howlet2 2009-12-30
  • 打赏
  • 举报
回复
期待中。。。。
pw_Start 2009-12-30
  • 打赏
  • 举报
回复
。。。
楼上几位都说的差不多了,呵呵
pw_Start 2009-12-30
  • 打赏
  • 举报
回复
我提个思路:
自己实现一个大整数类,并实现大整数减法的操作,求余时,可以用减法来做
比如两个大整数a和b,要求a%b,可以这样实现
while( a > b )
a -= b;
return a;
//上面只考虑是正数的情况,如果有负数,可以转换成正数再处理

这个大整数类,可以采用字符串来实现,也可以将其分成几段,每段分别用unsigned long int来保存
  • 打赏
  • 举报
回复
[Quote=引用楼主 happyboy16 的回复:]
每行都类似于        128166730406392893,rsrch,1,Write,3193909248,28672,2274      的文本文件,
我使用    fgets(buffer,200,input)  从文本读入,
再使用    sscanf(buffer,"%lf,%[^,],%ld,%[^,],%lld,%ld,%lf",&time,pc,&device,ope,&lsn,&size,&pro);分别赋给每个变量。
现在的问题是第五个变量lsn越界了,因为3193909248已经超过unsigned long int的最大值。
我对lsn这个变量的处理很简单,只需要将其从文本读入后,与6291456取余操作即可:lsn=lsn%6291456。但是lsn在读入时就越界了,所以结果不对,请问各位大侠,这个问题如何解决?感谢感谢!
[/Quote]

用64位数据,如果还不够用,那就用大数库吧,gmp不错。
selooloo 2009-12-30
  • 打赏
  • 举报
回复
取余操作也得把数先取出来才行

可以用unsigned long long lsn;
scanf("%llu",&lsn);
可以取出比3193909248还大的数
赵4老师 2009-12-30
  • 打赏
  • 举报
回复
再不行就用数组保存数,用小学列竖式的方法做减法,循环直到不够减,结果就是所求余数。
赵4老师 2009-12-30
  • 打赏
  • 举报
回复
__int64
%I64u
z569362161 2009-12-30
  • 打赏
  • 举报
回复
结帖率:0.00% 。求余也是0。
james_hw 2009-12-30
  • 打赏
  • 举报
回复
自己定义超大数

typedef unsigned int[2] UINT64;

typedef unsigned int[4] UINT128;

或者

typedef struct
{
unsigned int HIGH;
unsigned int LOW;
}UINT64;
happyboy16 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 selooloo 的回复:]
取余操作也得把数先取出来才行

可以用unsigned long long lsn;
scanf("%llu",&lsn);
可以取出比3193909248还大的数
[/Quote]
我使用的是VC6.0,貌似编译器不支持unsigned long long lsn;
error C2632: 'long' followed by 'long' is illegal
东大坡居士 2009-12-30
  • 打赏
  • 举报
回复
存数组里,
http://topic.csdn.net/t/20041203/16/3613534.html
suchx 2009-12-30
  • 打赏
  • 举报
回复
3193909248貌似小于最大的无符号数吧,maxunsigned=42亿吧,这个数才31亿
suchx 2009-12-30
  • 打赏
  • 举报
回复
大数类貌似是不错的选择,至少要把变量读入内存
shellfish567 2009-12-30
  • 打赏
  • 举报
回复
求余好像就是个减法……
int chu=m;
int beichu=n;
int yu=chu-beichu;
while(yu>beichu){
yu=yu-beichu;
}
if(yu==chu%beichu)
printf("结论成立\n");
shellfish567 2009-12-30
  • 打赏
  • 举报
回复
还有比较取巧的办法,你可以对6291456*2一直乘到小于long int不能再大了为止,然后用lsn-它,再用差除以6291456。做加减法要比做除法占用效率低多了

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧