鱼C论坛

 找回密码
 立即注册
查看: 3790|回复: 5

变量溢出问题

 关闭 [复制链接]
发表于 2011-6-20 00:57:00 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 Love 梦想 于 2011-6-20 01:04 编辑

C语言中 如果让一个变量 存储 十个9或以上 并且可以进行运算
例如
9999999999+1=10000000000
能实现类似功能也行


请给出简单的实现代码并给出注释及其实现原理...

曾请教过一些人,结果净是理论。没一个可以给出实现代码... 纠结...

此问题解决后 就可以解决 小甲鱼老师的作品【文件合并器】(貌似是这个名)中无法处理大文件的BUG
当然我的最终目的并不是这个哈,文件合并器完全可以用DOS命令 【copy /b 图片+文件 合并文件】 实现

有几次发【求助贴】都没有人回答 结果被淹没了... 这次弄个悬赏,要是再淹没,就没话说咯...


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-6-20 00:57:01 | 显示全部楼层
  1. #include<stdio.h>
  2. #include<string.h>
  3. #define MAX_NUM 1000
  4. //a[]+b[]->c[]
  5. void plus(char *a, char *b, char *c);
  6.    
  7. int main() {
  8.     char a[MAX_NUM+2];
  9.     plus("9999999999", "1", a);
  10.     printf(a);
  11. }

  12. void plus(char *a, char *b, char *c) {     
  13.     char r[MAX_NUM+2];     
  14.     int _a, _b, _c, _r;
  15.         //获得a和b的位数
  16.     _a = strlen(a);
  17.         _b = strlen(b);
  18.         //不考虑进位进行首次相加
  19.     for(_r = 0; _a&&_b; r[_r++] = a[--_a] + b[--_b] - '0');     
  20.     for(; _a; r[_r++] = a[--_a]);     
  21.     for(; _b; r[_r++] = b[--_b]);
  22.         //处理进位
  23.     for(_c = 0; _c < _r; _c++)     
  24.         if (r[_c] > '9') {     
  25.             r[_c] -= 10;     
  26.             (_c + 1 == _r) ? r[_r++] = '1' : r[_c + 1]++;     
  27.         }   
  28.         //将数组r中的结果倒置
  29.     while(_r--) *c++ = r[_r];     
  30.     *c = 0;   
  31. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2011-6-20 01:50:08 | 显示全部楼层
百度下"C语言大数加法",源码无数,随便找个自己喜欢的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2011-6-20 13:13:37 | 显示全部楼层
本帖最后由 Love 梦想 于 2011-6-20 13:26 编辑


奇怪,书上貌似没有这种声明方式
char a[MAX_NUM+2];
不怎么明白...
最后一句 *c=0; 是不是多余的?

for 那几句 能不能拆一下

之前被自增、自减给弄的头大了...虽然最后弄明白怎么回事....

不过,不想再经历那种痛苦的回忆....现在看到【++】【- -】都有一种想死的感觉...

所以麻烦一下哈...顺便说一下 大概原理...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2011-6-20 14:22:52 | 显示全部楼层
本帖最后由 仰望天上的光 于 2011-6-20 14:23 编辑

#define MAX_NUM 1000
说明这个程序最多做1000位10进制数+1000位十进制数,和最多是1001位十进制数,再加上最后的'\0'所以用char a[MAX_NUM+2]; 保存这个字符串每个字符都是字符‘0’~字符‘9’。

修改程序:
//不考虑进位进行首次相加
for(_r = 0; _a&&_b; r[_r++] = a[--_a] + b[--_b] - '0');     
for(; _a; r[_r++] = a[--_a]);     
for(; _b; r[_r++] = b[--_b]);
以上代码可以拆为:
for(_r = 0; _a&&_b; ){
  --_a;//如果还是感觉不爽,可以写为_a-=1;后面类似
  --_b;
  r[_r] = a[_a] + b[_b] - '0';
  ++_r

for(; _a;) {
   --_a;
   r[_r] = a[_a];
   ++_r;
}
for(; _b; ){
   --_b;
   r[_r] = b[_b];
   ++_r;
}

大概原理就是用一个char表示一个十进制位(0~9),所以一个字符串就可以表示很多个十进制位(就是一个很大的数);接着模拟笔算加法按位相加并处理进位。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2011-6-20 15:42:45 | 显示全部楼层
仰望天上的光 发表于 2011-6-20 14:22
#define MAX_NUM 1000
说明这个程序最多做1000位10进制数+1000位十进制数,和最多是1001位十进制数,再加上 ...

非常感谢!!!!嘿嘿...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 18:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表