标题: [求助]大整数的+,-,*,/
scu_guzo
新生入学
Rank: 1


UID 211613
精华 0
积分 11(积分有什么用?)
帖子 15
阅读权限 10
注册 2007-9-23
来自 四川大学
状态 离线
发表于 2007-10-12 20:48  资料  个人空间  短消息  加为好友  添加 scu_guzo 为MSN好友 通过MSN和 scu_guzo 交谈 QQ
[求助]大整数的+,-,*,/

(上次版主完美地解决了整数的分拆问题....赞一个...)
:mo9iBb$uq%Zx~www.linuxeden.com读入两行数字
HA
R-BgtB1G
如:
9^C)PD0J-n_f"j \1234567890...www.linuxeden.comZm        C_
{&AC0WE

9876543210...www.linuxeden.com|Gehpn0j
(位数都小于500位,乘法的最大结果为1000位,除法忽略小数点后面的)
$mCC?-La        v[算他们的+,-,*,/
$H*f0kq%yc^目前我已知的最好的算法是这样的:用int型的数组,数组的每个元素存4位数#Pa ]b:d_^U6h
如:a[0]=12,a[1]=3456,a[2]=7890
j?#f
R9} f;Qe1x i
    b[0]=98,b[1]=7654,b[2]=3210p+g7?3r|{GF
然后把他们进行+ - * /;(这一步就很简单了)7Ml        [7`W
我的问题是如何把数字式的字符串快捷地读入整型数组里呢???&h!b*PryT
好像是要用到sscanf()函数 和%n
;\Y+D1H~www.linuxeden.com%n到底怎么用啊???好像很多c/c++教材都没有提到%n哦 ..

顶部
不容错过的IBM 集群技术资源汇总
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 在线
发表于 2007-10-13 09:01  资料  个人空间  短消息  加为好友 
scanf 的 manual 里面有说明怎么用 %n





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
scu_guzo
新生入学
Rank: 1


UID 211613
精华 0
积分 11(积分有什么用?)
帖子 15
阅读权限 10
注册 2007-9-23
来自 四川大学
状态 离线
发表于 2007-10-13 15:58  资料  个人空间  短消息  加为好友  添加 scu_guzo 为MSN好友 通过MSN和 scu_guzo 交谈 QQ
不会看啊 ....我用的是windows
euz)TUk b9l+f        QLinux伊甸园论坛麻烦版主讲一下哦..... J.`ksf6bbn
好像是先用scanf()函数将字符串读到字符数组里(如:char s[500])
%S)i:d(mW然后用sscanf()函数(不是scanf)将数组s里的元素读到int型的数组里k-F#Oka
kuiu

Linux伊甸园论坛oKx"})c7qP A7m v*l
ps:如果大整数的长度刚好是4的倍数,如:12345678,那么int型的数组a[0]=1234,a[1]=5678;
^5ZJ2Ga/EHwww.linuxeden.com如果不是4的倍数呢?如:123456789,那么a[0]=1,a[1]=2345,a[2]=6789;www.linuxeden.com#i2G;Yt^8eR P*|
版主能不能讲一个比较快捷方便的办法完成这项操作......





算法是一门艺术
顶部
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 在线
发表于 2007-10-13 17:49  资料  个人空间  短消息  加为好友 
不是很明白





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
dearvoid
版主
Rank: 7Rank: 7Rank: 7
Clark J. Wang



UID 26605
精华 26
积分 61(积分有什么用?)
帖子 4814
阅读权限 100
注册 2002-10-12
来自 Beijing, China
状态 在线
发表于 2007-10-13 17:50  资料  个人空间  短消息  加为好友 
不晓得哪儿找到这么些‘稀奇古怪’的题目 :





'
◆ 发帖时请【突出主题】, 以便您的问题能够及时得到回复
◆ 发帖时请将您的【代码】或者【脚本】写在 [code] 和 [/code] 中间
顶部
不容错过的IBM 集群技术资源汇总
scu_guzo
新生入学
Rank: 1


UID 211613
精华 0
积分 11(积分有什么用?)
帖子 15
阅读权限 10
注册 2007-9-23
来自 四川大学
状态 离线
发表于 2007-10-13 18:35  资料  个人空间  短消息  加为好友  添加 scu_guzo 为MSN好友 通过MSN和 scu_guzo 交谈 QQ
呵呵就是soj上的题目啦....www.linuxeden.comD]\+hl\u b8m
版主有兴趣可以去做几道题a
aAtV!F*m7h d6f7Z

cs.scu.edu.cn/soj
U8c^;P4C1[OVLinux伊甸园论坛(那上面的论坛跟本没法交流,所以就来linux的论坛了..)





算法是一门艺术
顶部
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 离线
发表于 2007-10-15 10:17  资料  个人空间  短消息  加为好友 
只不过是把字符串按顺序转成数字放到数组里,弄个循环以4为单位取字符串转换不就行了?不知道楼主在烦恼什么?





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
scu_guzo
新生入学
Rank: 1


UID 211613
精华 0
积分 11(积分有什么用?)
帖子 15
阅读权限 10
注册 2007-9-23
来自 四川大学
状态 离线
发表于 2007-10-18 15:18  资料  个人空间  短消息  加为好友  添加 scu_guzo 为MSN好友 通过MSN和 scu_guzo 交谈 QQ


QUOTE:
原帖由 flag 于 2007-10-15 10:17 发表
0xec-Q U/uwww.linuxeden.com只不过是把字符串按顺序转成数字放到数组里,弄个循环以4为单位取字符串转换不就行了?不知道楼主在烦恼什么?

Linux伊甸园论坛5g3M_ff
大哥  我就是不知道怎么你弄啊....Linux伊甸园论坛,m#F_7ru;|
有什么函数?或者  cin????





算法是一门艺术
顶部
不容错过的IBM 集群技术资源汇总
flag
版主
Rank: 7Rank: 7Rank: 7
版主



UID 19801
精华 1
积分 28(积分有什么用?)
帖子 5581
阅读权限 100
注册 2002-7-19
状态 离线
发表于 2007-10-18 17:17  资料  个人空间  短消息  加为好友 
字符串转换成数字前面你不是也写了吗,用sscanf,或者atoi也可以啊,然后弄个循环,把字符串拆成4个一组的转不就是了?我是真不知道你到底在烦什么





上帝说,有问题,找GOOGLE 写程序是很神圣的事情!同样只是装系统,卖菜的大娘会的事情不见得就跟卖菜一样了。
顶部
xgf
新生入学
Rank: 1



UID 214769
精华 0
积分 11(积分有什么用?)
帖子 34
阅读权限 10
注册 2007-10-17
状态 离线
发表于 2007-10-27 16:24  资料  个人空间  短消息  加为好友 
大整数的+-× /, 一般是将大整数看做一个字符串,每一位上的数字对应一个字符,然后对字符串进行处理。下面是进行大整数加法运算的例子,其他采用相同的方法可以实现。
4y2a+l$P0qi%j UZ
Mhy M"H]F\www.linuxeden.com#include <stdio.h>
lS!Q2D$|I~www.linuxeden.com#include <stdlib.h>
ODTg*Ip WLinux伊甸园论坛#include <string.h>;]&eI$U.A b1LR
#define SIZE 5000c*l!?;B/@9h

Q
RIGJpLinux伊甸园论坛
char *pa;                        // 字符串a首地址
!IC
m[3?0f,dH
char *pb;                        // 字符串b首地址
a/_7w ie{Kchar *p_sum;                // 结果字符串Av-BnK1Z(w
G

int len_a = 0;                // 字符串a的长度Linux伊甸园论坛fFD-yT
int len_b = 0;                // 字符串b的长度K-qt"R D-i,g_

z/\E-PQ*Xwww.linuxeden.comvoid add();H$f NE\N        pi%b1g
{
/E(rF,{/g:lP        int len;                                                // 结果字符串的长度3?z*Mn5Z.g+[
        int carry = 0;                                        // 是否有进位
%?"]$T }]
Z%s*Z"]
        char *start_a = pa+len_a-1;                // 从a的个位开始'\!{
oz
I        `*[V ])T

        char *start_b = pb+len_b-1;                // 从b的个位开始www.linuxeden.com3yO:NF,c
S
Za0W%|

        char *start_c;                                        // 结果的个位Linux伊甸园论坛        q%|V^8z

5Q)qm+w        S#D[        len = len_a>len_b?len_a:len_b;
c_qo:a.t        p_sum = (char*)malloc((len + 2) * sizeof(char));*T7PcC$?i
]4t
N

        start_c = p_sum+len;
&^N[u"nVd        *(p_sum+len+1) = '\0';,d-P        v%~(\,Q5d7jL
       
[7S9I,Ggy*T        while((start_a >= pa) && (start_b >= pb))+TAo w!F]0T'i{
        {
m1t-Rq2B
u;?ALinux伊甸园论坛
                if(*start_a + *start_b + carry - '0' <= '9')"oN2y1eW$YyA`
                {
+e+W1i)r5Y&[2V C                        *start_c = *start_a + *start_b + carry - '0';
0k/G
|0]j!p5xA        \*}
                        carry = 0;
t1m;y/{A7NiZ@[i                }        V2AS1nU3E;yC
                elseC^
j(cc!Z#~-hH        j(K

                {V3hY|0O7Q ?:{xS
                        *start_c = *start_a + *start_b + carry - '9' - 1;
"r+Zc._6F$p
Ny+ubdwww.linuxeden.com
                        carry = 1;
x+e!R{.d7H                }
-do;lznf                start_a--;[5c+P
A.RqF*{8|

                start_b--;Linux伊甸园论坛J&E,?j.~ZF
                start_c--;liU0Wm4iz
        }0N;\)m8zg5KE

-O T4j7hJF3Lwww.linuxeden.com        while(start_a >= pa)
gf)EiyU)RG%Ylwww.linuxeden.com        { IcgS {KT
M

                if(*start_a + carry <= '9')www.linuxeden.com
O9NB\%a

                {Linux伊甸园论坛[@{-snj(w
                        *start_c = *start_a + carry;
Q+tL)H0kR                        carry = 0;NDsT1^(`
                };sv        h        ^1`(CA,H
                elseQI/H"Ywa
                {Q2XqGT_uP
                        *start_c = *start_a + carry - 10;(hM)\S&z`2Y1rQ
                        carry = 1;
M~%L/m6[.n$mY:j]                }
$iUfu&Q;F(b                start_a--;:b'RS}&I$|
                start_c--;
h3O&Q2D8F2Wo        }
!YdL$c"f ]3^.FLinux伊甸园论坛4o)Bd/f/q)^I
        while(start_b >= pb)Linux伊甸园论坛z/L2ke.X
lU @

        {&\        t-['mb,h
X2p        tp

                if(*start_b + carry <= '9')www.linuxeden.com;D{k
[t&Tup

                {Linux伊甸园论坛9X3N9_ZD7P
                        *start_c = *start_b + carry;"xF }        {z7Rxf-z
o

                        carry = 0;
        HM?6M-c8Xwww.linuxeden.com                } o _2}}3U
                elseLinux伊甸园论坛Ry^}^
S,]h W'B

                {
/K
T3pv~tR,G&d9b
                        *start_c = *start_b + carry - 10;Linux伊甸园论坛2b#q/J _J@
                        carry = 1;*S2|4|6ho
                }
#r%KI,DID        H6y&]{                start_b--;
4yB5cR%P%o,vLinux伊甸园论坛                start_c--;(l"}}e5hW`}
        }
~%B6_b sWr
B[Y!S
]        U+g(t
        if(carry)1AQ9Y8~#_B(`
        {
.k8s.n@Fh&n                *p_sum = '1';L!t!Z6b,}j        p a+e@
                start_c = p_sum;
iT} bNy-v6f_4C        }YNOi4AO%]7A;y
        elsewww.linuxeden.com!hWQ/lC5xY/@3w
        {$q{*Ms#e"C:g@
                start_c = p_sum + 1;
PfP4ut](k$OLinux伊甸园论坛        }
R? Gl~`bLinux伊甸园论坛Linux伊甸园论坛'\7`&[2~x+dJ2c)HB
        printf("%s + %s = %s\n", pa, pb, start_c);
Vp-]'`nF
rv        GAPLinux伊甸园论坛        free(pa);:uZ8s9nl[#~
        free(pb);Q6T/N3B0B$\/S2\Hd/^
        free(p_sum);O)p%Y{*lY4c0f
}www.linuxeden.comY.qE4b'goQ
Linux伊甸园论坛-[:o~._vh~
int main(void)
"h Q5zgUS#A4p"nLinux伊甸园论坛{'m:kZ Eb
        char arr_in[SIZE];Linux伊甸园论坛}6I6C!P.lw;l
        Linux伊甸园论坛{BjA&T`uT
        printf("Please input a: ");
zyt|%Z:XLinux伊甸园论坛        scanf("%s", arr_in);{/E\{ Jq?
        len_a = strlen(arr_in);www.linuxeden.comn g&aPG^[
        pa = (char *)malloc((len_a + 1) * sizeof(char));
WP*?d)m3HSHT\w#Mwww.linuxeden.com        strcpy(pa, arr_in);-V2|+v|4b
       
&gWj8H*[:Y        printf("Please input b: ");VCD0g8d2WN&b+|J
        scanf("%s", arr_in);
Cu;@dAq)XK}8]?        len_b = strlen(arr_in);
?*Y        Y7i`fZ        pb = (char *)malloc((len_b + 1) * sizeof(char));
[[$E$Izr        strcpy(pb, arr_in);k^*VI~!SF
       
q(HX7L]n0g        add();
B1HWdbg{v Ewww.linuxeden.com8] EM`@(^
        return 0;&YG,t;A0F
}
G/Y|,nC
x4awww.linuxeden.com
imv+qH;cD!Y!u.~z[
[ 本帖最后由 xgf 于 2007-10-27 19:00 编辑 ]

顶部
不容错过的IBM 集群技术资源汇总
 



当前时区 GMT+8, 现在时间是 2008-5-16 11:05

    Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.
Processed in 0.173822 second(s), 5 queries

清除 Cookies - 联系我们 - Linux伊甸园 - Archiver - WAP