鱼C论坛

 找回密码
 立即注册
查看: 4011|回复: 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 | 显示全部楼层
#include<stdio.h> 
#include<string.h>
#define MAX_NUM 1000 
//a[]+b[]->c[]
void plus(char *a, char *b, char *c);
   
int main() { 
    char a[MAX_NUM+2]; 
    plus("9999999999", "1", a); 
    printf(a); 
}

void plus(char *a, char *b, char *c) {     
    char r[MAX_NUM+2];     
    int _a, _b, _c, _r; 
        //获得a和b的位数
    _a = strlen(a);
        _b = strlen(b); 
        //不考虑进位进行首次相加
    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(_c = 0; _c < _r; _c++)     
        if (r[_c] > '9') {     
            r[_c] -= 10;     
            (_c + 1 == _r) ? r[_r++] = '1' : r[_c + 1]++;     
        }    
        //将数组r中的结果倒置
    while(_r--) *c++ = r[_r];     
    *c = 0;    
} 
想知道小甲鱼最近在做啥?请访问 -> 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-11-14 12:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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