| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 921 人关注过本帖, 1 人收藏
标题:请问一个小问题
只看楼主 加入收藏
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
结帖率:100%
收藏(1)
已结贴  问题点数:50 回复次数:12 
请问一个小问题
关于大数相加的   我知道这个问题你们会讨论很久了  我自己也做出一个,但很麻烦,比较难理解   请问谁有比较简单的算法吗??  这个是附属问题   

我真正想问的是  比如
char ch[30];
int i;
gets(ch);
i=strlen(ch);
如果我输入的ch个数>50;   如输入字符共70;   
我知道i会赋值为  70    怎么能让它继续运行下去  而不会运行出错呢?? 因为输入的超过了原来分配给ch[]的空间?
还有一个问题,一开始 我用的是  int num[n]=atoi(&ch[n]); n++;  我想这样直接把0~9的字符的转变为数字;但这样行不通,这是什么原因呢?

抱歉 一个贴就这么多小问题   谁能帮我解决一下吗?
           
搜索更多相关主题的帖子: 空间 
2010-09-16 12:19
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
讨论很久?
空间你可以动态分配!
 
字符转换没必要用atoi()
atoi是转换字符串,
直接-48 或者调用C语言的单字符转换函数(函数名忘了 汗)
2010-09-16 13:01
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
至于简单的算法

逆转相加
就以实际的数值进行存储
比如  1234567 + 12345678


7654321 和 87654321 的形式存储

这样 从序号0开始

0 1 2 3 4 5 6 7 8 9
7 6 5 4 3 2 1 '\0'
8 7 6 5 4 3 2 1 '\0'

位数补齐用0填充
2010-09-16 13:06
遮天云
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:农村一小伙
等 级:贵宾
威 望:12
帖 子:1132
专家分:2671
注 册:2010-6-1
收藏
得分:10 
http://bbs.这里有个大数相加的!楼主看看合你的意思不
2010-09-16 13:18
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
回复 4楼 遮天云
怎么说呢  个人认为那个还没有我做的好理解   
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
main()
{
    char n1[100],n2[100];
    int sum[102];


    int len1,len2;
    int max,min,t;
    int i=0;
    printf("输入第一个大数:");
    scanf("%s",n1);
    printf("输入第二个大数:");
    scanf("%s",n2);
    len1=strlen(n1);
    len2=strlen(n2);
    printf("第一个数有%d位\t num1=%s",len1,n1);
    printf("\n");
    printf("第二个数有%d位\t num2=%s",len2,n2);
    printf("\n");
    max=(len1>=len2)?len1:len2;
    min=(len1<=len2)?len1:len2;
    t=max;
    while (t>0)
    {
        len1--;
        len2--;
        if (min>0)            如果比较少位数的那个数还没有加完   那就继续加
            sum[t]=(n1[len1]-'0')+(n2[len2]-'0');
        else     如果加完了  那就把比较多位数的剩下的数都直接放在sum【】中去   但要先判断哪个数还有剩余
            if (len1>=len2)
                sum[t]=n1[len1]-'0';
            else sum[t]=n2[len2]-'0';

        min--;
        t--;
    }
    sum[0]=0;
    while (i<=max)    这儿才把每个sum[i] 判断是否大于10  进位的关系
    {
        while (sum[i]>=10)
        {

            sum[i]-=10;
            sum[--i]+=1;
        }
        i++;
    }
    i=(sum[0]==0)?1:0;
    printf("sum==");
    for (;i<=max;i++)
    {
        printf("%d",sum[i]);
    }
}

我想想你们说的倒叙怎么弄先   


还有啊   其实我的主要问题是后面的问题不懂    还请讲解讲解  比如说2楼说的动态分配空间是怎么回事?而且他也理解错了我的问题  我是想说怎么让它继续运行下去  输入的字符过大  会出现那叫什么问题的问题  反正是不能继续运行下去了   


还有他所说的单个字符转化??什么函数来的?


那个要更简单的运算法  我也会继续想的

谢谢啦  希望能回答我更多的疑问
2010-09-16 16:36
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:0 
void main()
{
    char c;
    char *b;
    int i=0;
    while(c=getchar(),c!='\n'){
        if(0==i){
            b=(char*)malloc(2*sizeof(char));
            b[i++] = c;
            continue;
        }
        b = (char*)realloc(b,(i+2)*sizeof(char));
        b[i++]=c;
    }
    b[i] = '\0';
//....代码.....
    printf("%s",b);
    free(b);
}
2010-09-16 17:24
重新分区
Rank: 2
等 级:论坛游民
帖 子:12
专家分:32
注 册:2010-4-15
收藏
得分:0 
不会吧,我用你那个编译运行就会报错啊
2010-09-16 18:27
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
回复 6楼 hahayezhe
你的这种是一种方法   但如果我只是想输入输出 一串字符的话可以更简单点
#include<stdio.h>
main()
{
    char ch;
    while ((ch=getchar())!='\n')
        printf("%c",ch);
}

getchar()利用键盘缓冲读入就可以了。
如果我要记共输入了多少字符  可以直接用个 int i在循环里面也可以。那我有点疑问了   我这种方法 char ch;到底最终分配了多少空间啊?
2010-09-16 20:12
lwlls668
Rank: 2
等 级:论坛游民
帖 子:59
专家分:72
注 册:2010-4-9
收藏
得分:0 
回复 7楼 重新分区
我的??我的在我这儿可以运行呀
2010-09-16 20:13
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:40 
程序代码:
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#include <assert.h>
#define SUCCEEDED(m_p) assert(m_p!=NULL)
#define SUCCEEDED_FREE(m_p) assert(m_p!=NULL);free(m_p)
struct Number{
    char *m_p;
    int m_i;
};
char* Create_char(int &i){
    char c;
    char *b;
    while(c=getchar(),c!='\n'){
        if(0==i){
            b=(char*)malloc(2*sizeof(char));
            SUCCEEDED(b);
            b[i++] = c-'0';
            continue;
        }
        b = (char*)realloc(b,(i+2)*sizeof(char));
        SUCCEEDED(b);
        b[i++]=c-'0';
    }
    b[i] = '\0';
    return b;
}
void Changeover(char *p,int i){
    int j= i/2;
    for(int k=0;k<j;k++){
        char c = p[k];
        p[k] = p[--i];
        p[i] = c;
    }
}
char *AddFuntion(const Number *m_p1,const Number *m_p2,int &m_x){
    int m_i = m_p1->m_i > m_p2->m_i?m_p1->m_i:m_p2->m_i;
    char *p = (char*)malloc(m_i+2);
    SUCCEEDED(p);
    memset(p,0,m_i+2);
    memcpy(p,m_p1->m_p,m_p1->m_i);
    for(int i = 0 ;i < m_p2->m_i; i++){
        char c = p[i] + m_p2->m_p[i];
        int j=1;
        p[i] = c%10;
        while(c>=10){   
            if(j>1)
                p[i+j-1]=c%10;
            p[i+j]++;
            c = p[i+j];
            j++;
        }
    }
    while(p[m_i--]=='\0');
    m_x = m_i+2;
    return p;
}
void NumberPrint(Number &t){
    for(int i=t.m_i;i>0;)
        printf("%d",t.m_p[--i]);
    printf("\n");
}
void main()
{
    Number m_a,m_b;
    m_a.m_i = 0;
    m_b.m_i = 0;
    printf("输入大数A:");
    m_a.m_p = Create_char(m_a.m_i);
    fflush(stdin);
    printf("输入大数B:");
    m_b.m_p = Create_char(m_b.m_i);
    fflush(stdin);
    Changeover(m_a.m_p,m_a.m_i);
    Changeover(m_b.m_p,m_b.m_i);   
    NumberPrint(m_a);
    NumberPrint(m_b);
    Number m_c;
    m_c.m_p = AddFuntion(&m_a,&m_b,m_c.m_i);
    printf("A+B=:");
    NumberPrint(m_c);
    SUCCEEDED_FREE(m_c.m_p);
    SUCCEEDED_FREE(m_b.m_p);
    SUCCEEDED_FREE(m_a.m_p);
}
2010-09-17 08:56
快速回复:请问一个小问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014562 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved