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

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在读入时就越界了,所以结果不对,请问各位大侠,这个问题如何解决?感谢感谢!
...全文
604 14 打赏 收藏 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
木鸟冲冲冲 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。做加减法要比做除法占用效率低多了
内容概要:本研究聚焦于内置式永磁同步电机(IPMSM)在全速域范围内的最优电流轨迹规划与控制策略优化,提出了一种计及电压与电流双重约束的MTPA(最大转矩电流比)与弱磁控制融合方法。通过Simulink搭建仿真模型,系统分析了电机在不同转速区间下的运行特性,建立了精确的电机数学模型,并综合考虑了电压极限椭圆与电流极限圆的约束条件,实现了全速域内电流矢量的最优分配。研究设计了基于电压饱和判据的分区切换逻辑,确保MTPA控制与弱磁控制间的平滑过渡,解决了传统控制模式在高速区易出现的失稳与效率下降问题,最终在仿真平台上验证了所提控制策略在提升电机效率、扩大调速范围和增强动态响应方面的优越性; 适合人群:具备电机控制或电力电子领域基础知识的研究生、科研人员及电气工程相关专业的高年级本科生; 使用场景及目标:①研究IPMSM在全速域范围内的高效运行控制;②设计并仿真验证MTPA与弱磁控制的融合策略;③分析电压与电流双重约束对电机性能的影响; 阅读建议:此资源以Simulink仿真实现为核心,建议读者在学习过程中结合电机学、电力电子及自动控制理论,深入理解控制算法的设计逻辑,并动手复现仿真模型,通过调整参数观察系统响应,以加深对理论知识与工程实践结合的理解。

70,040

社区成员

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

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