| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 697 人关注过本帖
标题:反向相加问题
只看楼主 加入收藏
大宝爱小彭
Rank: 1
等 级:等待验证会员
帖 子:4
专家分:0
注 册:2010-10-13
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
反向相加问题
长整数加运算的实现要求:通过键盘输入超长(可能超出计算机能够直接处理的范围)的两个整数,计算后输出其加运算的结果。用C语言实现。分析:长整数是指超过语言提供的内部数据类型之表达范围的数。于是长整数只能放在程序员自己定义的数据类型,例如字符数组类型中,每个元素仅仅表示长整数的其中一位。为了简单起见,本题的大数和是指所有的正整数的和。我们知道算术加法是从个位开始逐位相加,如果有进位的话就将进位加到更高位上去。这个过程是可以用编程的方法实现的,因为逐位加是一种规律性的操作。然而,我们要对输入的数据做些准备处理,因为输入的数字串是从高位到低位排列的,因而,两个大数只有高位是对齐的,低位并没有对齐。知道了这个,就可以将两个大数都逆转一下,然后进行反向相加处理,例如,对123+56789进行倒排相加:       3210000+ 9876500   2196500做完了逐位加操作之后,将结果字串翻转,变成了“0056912”,然后去掉前导的0就是所要求的结果“56912”了。设计一:分别设计如下的函数实现相应的功能#define MAX 200struct LONGNUMBER{      charnum[MAX]; //存放长整数      intlength; //长整数的位数};//1、输入长整数,逐位放在字符数组中void GetNumber( struct LONGNUMBERLongNumber );//2、输出长整数void PrintNumber( struct LONGNUMBERLongNumber );//3、倒置,即把诸如24534变为43542void Reverse( struct LONGNUMBER LongNumber);//做加法运算void Plus( struct LONGNUMBER num1, structLONGNUMBER num2, struct LONGNUMBER num3);   



   3210000+ 9876500=2196500向左对齐满十往右进一

[ 本帖最后由 大宝爱小彭 于 2011-3-7 22:54 编辑 ]
搜索更多相关主题的帖子: 计算机 程序员 正整数 C语言 元素 
2011-03-07 22:20
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:5 
楼主的意思是数组a={ 1,2,3},数组b={5,6,7,8,9},然后将两个数组倒序以后,两个数组相对元素相加?

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-07 22:33
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:5 
意思是.
让人去编个程序 一个一个第去进行和操作.
一般两个数相加,如果两个数的位数不等,那么就会出现不对齐如:
12345

   12
______
而反向操作呢就可以对齐了如:
54321

21000
_____
这样的话 把两个数放到两个字符数组去,这样就可以对每一位进行判断分析,进一或者不进一.
到这里计算完后 
再把结果逆回来 就是 长整数的计算结果了  很简单吧

[ 本帖最后由 do8do8do8 于 2011-3-7 22:51 编辑 ]

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2011-03-07 22:39
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
root@~ #echo $((3210000+9876500))
13086500
root@~ #
怎么会得 2196500呢?

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-07 22:46
『点点滴滴』
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:168
专家分:1035
注 册:2007-7-9
收藏
得分:5 
#include <stdio.h>
#include <math.h>
int main()
{
    int a[10] = {0} , b[10] = {0} , res[10] = {0} ;
    int x , y , c = 0 , t = 0 ;
    int lenx = 0 , leny = 0 ;
    int i , j ;
    i = j = 0 ;
    scanf("%d%d", &x , &y ) ;
    while( x )
    {
        a[i++] = x % 10 ;
        x /= 10 ;
        lenx++ ;
    }
    while( y )
    {
        b[j++] = y % 10 ;
        y /= 10 ;
        leny++ ;
    }
/*    for( i = lenx - 1 ; i >= 0 ; --i )
    {
        t += a[lenx - i - 1] * (int)( pow( 10 , i ) + 0.5 ) ;
    }
    x = t ;
    x *= (int)( pow( 10 , 7 - lenx ) + 0.5 ) ;
    t = 0 ;
    for( i = leny - 1 ; i >= 0 ; --i )
    {
        t += b[leny - i - 1] * (int)( pow( 10 , i ) + 0.5 ) ;
    }
    y = t ;
    y *= (int)( pow( 10 , 7 - leny ) + 0.5 ) ;
    printf("%d\n", x + y ) ;   */
    for( i = 0 ; i < 7 ; ++i )
    {
        t = a[i] + b[i] + c ;
        res[i] = t % 10 ;
        c = t / 10 ;
    }
    while( res[i] == 0 ) i-- ;
    for( ; i >= 0 ; --i )
        printf("%d", res[i] ) ;
    printf("\n");
    return 0 ;
}
题没说清楚白写了一段
2011-03-07 22:48
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
猜测的, 自当一个练手~~
root@~ #cat a.c
程序代码:
#include <stdio.h>

int main (void) {

        int a[]={1,2,3,5},b[]={5,6,7,8,9};
        int result;
        int sumele (int n,int a[]);
        int revele (int n);

        result=sumele(4,a)+sumele(5,b);

        printf ("%i\n",result);
        printf ("%i\n",revele(result));

        return 0;

}

int sumele (int n,int a[]) {

        int b=1000000,sum=0;
        for(n--;n>=0;n--) {
                sum+=a[n]*b;
                b/=10;
        }

        return sum;

}

int revele (int n) {
        int num=0,b=10000000;
        while(n!=0) {
                num+=(n%10)*b;
                n/=10;
                b/=10;
        }

        return num;
}


root@~ #./a
15197500
579151
root@~ #

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-03-07 23:04
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
收藏
得分:0 
呵呵 方法很多
不用结构体也成 
举个简单的:
gets(buf);呵呵 直接敲进去2131313141442343423242423423424224
用结构体的话 其实也是那个意思 只不过看起来顺眼些
我看对字符串的操作 肯定很复杂 若能用递归处理的话 看起来代码就简洁些

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2011-03-07 23:16
快速回复:反向相加问题
数据加载中...
 
   



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

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