标题: [求助]大整数的+,-,*,/
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
[求助]大整数的+,-,*,/

(上次版主完美地解决了整数的分拆问题....赞一个...)7J
c9av?'}yo

读入两行数字www.linuxeden.com,b2pL%RHn
如:
E0s}j3p{Z1234567890...J8ja-I,F:M6H.k        h1F-P
9876543210...

q1Yn3]"@h        q
(位数都小于500位,乘法的最大结果为1000位,除法忽略小数点后面的)
o{z5_,wBb/WK算他们的+,-,*,/
-h:s7@9T&N.UP9C!PW目前我已知的最好的算法是这样的:用int型的数组,数组的每个元素存4位数+j]$C9Yfvq0j#K@9i
如:a[0]=12,a[1]=3456,a[2]=7890"^ {y2_K$f/T
    b[0]=98,b[1]=7654,b[2]=3210"d3hQs+iv^
然后把他们进行+ - * /;(这一步就很简单了)W[dV7GZ        y
我的问题是如何把数字式的字符串快捷地读入整型数组里呢???

~{n        e2o$d}
S
好像是要用到sscanf()函数 和%n
*JM*x[ZeFLinux伊甸园论坛%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
%Wc5R2lr-S麻烦版主讲一下哦.....4j8PMM2^1l
好像是先用scanf()函数将字符串读到字符数组里(如:char s[500])4Z)W-Z)Q+w+h        Xe6e
然后用sscanf()函数(不是scanf)将数组s里的元素读到int型的数组里V-?'Q9q3|8r%D&M~

*H(o)@:f5Rk%{+U6rk;ups:如果大整数的长度刚好是4的倍数,如:12345678,那么int型的数组a[0]=1234,a[1]=5678;

[,nS8Re0P
如果不是4的倍数呢?如:123456789,那么a[0]=1,a[1]=2345,a[2]=6789;Linux伊甸园论坛        Z}lfQ5c!U        V&T
版主能不能讲一个比较快捷方便的办法完成这项操作......





算法是一门艺术
顶部
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.com+pf.j#g2dJh_:J(b
版主有兴趣可以去做几道题

p_yzY+a;g)`Q1I
cs.scu.edu.cn/soj
&P5e{[w5m(那上面的论坛跟本没法交流,所以就来linux的论坛了..)





算法是一门艺术
顶部
不容错过的IBM 集群技术资源汇总
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 发表 u;\,lL.D.]!G5_
只不过是把字符串按顺序转成数字放到数组里,弄个循环以4为单位取字符串转换不就行了?不知道楼主在烦恼什么?

X"f6TS1x8a*e2QymP,_大哥  我就是不知道怎么你弄啊....
$r-?]n L:ge9c有什么函数?或者  cin????





算法是一门艺术
顶部
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  资料  个人空间  短消息  加为好友 
大整数的+-× /, 一般是将大整数看做一个字符串,每一位上的数字对应一个字符,然后对字符串进行处理。下面是进行大整数加法运算的例子,其他采用相同的方法可以实现。

JC;[j2}#A[+XCpA!D^
Linux伊甸园论坛Wq#z.O"B
h:v

#include <stdio.h>Linux伊甸园论坛(A p?a        b{(D%wY
#include <stdlib.h>
5m6x7U%Ofb-E Gx#}#include <string.h>
0g@'esk,t#define SIZE 500BO.Vw/H

S0W3ym:R2M3dmchar *pa;                        // 字符串a首地址
1K;PWlPlchar *pb;                        // 字符串b首地址Linux伊甸园论坛hP        ^a(Axs8^#a
char *p_sum;                // 结果字符串Plm/b)~5T
h!hJV

int len_a = 0;                // 字符串a的长度
9b,G^B.fdint len_b = 0;                // 字符串b的长度www.linuxeden.com|Gi'rqe/m%P,s/k
:^7gh_9Lc)[*d\
void add()
!O@"_9Y;`{
c ToZ1Z]
Dy
        int len;                                                // 结果字符串的长度
\6LfD:P;DR        int carry = 0;                                        // 是否有进位
"C9ay%k(l        char *start_a = pa+len_a-1;                // 从a的个位开始
/B3O)pch)yO%KioLinux伊甸园论坛        char *start_b = pb+len_b-1;                // 从b的个位开始N'j'e7ETm
h%hB z s

        char *start_c;                                        // 结果的个位
+GKoi.j;~Linux伊甸园论坛5Y7is%L)U
        len = len_a>len_b?len_a:len_b;Z'WO%`{$mCQ1m~!YN
        p_sum = (char*)malloc((len + 2) * sizeof(char));
l
EPt"^'wT&u-]+Q
        start_c = p_sum+len;
/E K#T.Z|8W(j        *(p_sum+len+1) = '\0';
O`.[8S/L(U'\+_       
B)RV.Ve iM!sLinux伊甸园论坛        while((start_a >= pa) && (start_b >= pb))Linux伊甸园论坛p3G5[.DBT'tm{
        {x-c
ap2x[-i7g)w2e

                if(*start_a + *start_b + carry - '0' <= '9')Linux伊甸园论坛#MvWJ{4X7S'm,WO
                {
lc*T4Y'UPeLinux伊甸园论坛                        *start_c = *start_a + *start_b + carry - '0';(qha%uF/i5B
                        carry = 0;Linux伊甸园论坛5t~c;Ly!G
                }
,y
~        zU_!Owww.linuxeden.com
                else3PeD!Ye)Y
                {
!M`+R
\5Mv
                        *start_c = *start_a + *start_b + carry - '9' - 1; |(T_ZD:Z
                        carry = 1;www.linuxeden.comBu7LA*tNA8E
                }Linux伊甸园论坛a2izt"f&RrS-s
                start_a--;
L?(e+GnCY`                start_b--;
k,M%@3S)R^6@ ^T                start_c--;
r
m7Vn'u;l%|        Swww.linuxeden.com
        }Linux伊甸园论坛.Fu~y(nL&H L KG

$@j-SQh5W~www.linuxeden.com        while(start_a >= pa)
Xlf
@NLinux伊甸园论坛
        {
h'z2]:k8J        E&i\.t @                if(*start_a + carry <= '9')(Q
]m@!O

                {Linux伊甸园论坛 u1k#v0p$e&E2lGkCz
                        *start_c = *start_a + carry;
zt1x YMtb*Eg                        carry = 0;
l\&me!x-D?w        h                }
$A*~u7p+L&Zwww.linuxeden.com                else
w.]pPh\        ssLinux伊甸园论坛                {www.linuxeden.com8eQ
i(G5S;o

                        *start_c = *start_a + carry - 10;Linux伊甸园论坛 WO2Wdt-h'C7T
                        carry = 1;.O%ADd-].d/]^
X

                }Linux伊甸园论坛2D]!_K$Wa/a2~Z
                start_a--;Linux伊甸园论坛$pG^'RbN/S
                start_c--;,@!f O:A+g3A
        }
l\UeFc%i:kP^*`}+q)m,x9S:p
        while(start_b >= pb)
h amesKt,Z&f@"Dwww.linuxeden.com        {3^"fcxrA&k
                if(*start_b + carry <= '9')Linux伊甸园论坛@ vs lGd/K        U
                {
f_1r6Xf^Jv                        *start_c = *start_b + carry;_@^1}N
                        carry = 0;
1~h        {6I-P^X                };a eun+I6c3J`9LQ6T
                else
Z%st@iZ/`}&o;i0gJ                {
B
E;qzoVpwww.linuxeden.com
                        *start_c = *start_b + carry - 10;Linux伊甸园论坛sFb(or
                        carry = 1;Linux伊甸园论坛!J Kq7c$Q+e
                }
hB,@1p#|V UArw"~                start_b--;
4~7nXW+ew0]/ELinux伊甸园论坛                start_c--;
L*IV#gx,VYnULinux伊甸园论坛        }
C ZX8|!imsb2^*P'mJUo
        if(carry)+f1z$ejDy.pS
        {
'G4M        N(mh~                *p_sum = '1';
7qZq/}&uWCB                start_c = p_sum;
'N"]2jz:X+UVwww.linuxeden.com        }

^RfpXS
        else+M&v{6ja-FF6i
        {
5`3Ch@%N                start_c = p_sum + 1;
4@u9L9GaK        M        }WUQ*Rx@Ht&|Kz
CCZ        Js
        printf("%s + %s = %s\n", pa, pb, start_c);
zZ]3R^X4e(L

vv,W-@6^
        free(pa);
uIfQ w1m9G%`&@        free(pb);
3tXzp|!S9\7NU/B        free(p_sum);www.linuxeden.comi"WlWRj!`Ot
}Linux伊甸园论坛tj8~;\|!gei'EK

%jn&y%koi$[*T:Qsint main(void)
Cm&} M3v`{Linux伊甸园论坛,pqe)D BQQ8^
        char arr_in[SIZE];
Qvd([7R       
*|/}+D'[wt
u)hwww.linuxeden.com
        printf("Please input a: "); Y[2M?r
        scanf("%s", arr_in);
^4g)}wn!_[]
C5\        f
        len_a = strlen(arr_in);u)N oaJ8?
}

        pa = (char *)malloc((len_a + 1) * sizeof(char));{@l&S1q5y0_o8@
        strcpy(pa, arr_in);Linux伊甸园论坛
I/kHA3\f@.pB

        "M'E3U'|`X
        printf("Please input b: ");
{1K\m` a        scanf("%s", arr_in);
:Ms^ VkK_www.linuxeden.com        len_b = strlen(arr_in);
*a;rk_:Wb        pb = (char *)malloc((len_b + 1) * sizeof(char));        _2U2p+wlk
t\

        strcpy(pb, arr_in);
F#odf4}        r        www.linuxeden.comq tY!\Je3N        Z~
        add();
rYVXPwww.linuxeden.com-n
d;ITHOt @:B6s/H

        return 0; Y-NH:za&[G
}
*`0zX Rb
b*ZG)@

-E]H8i'CLinux伊甸园论坛[ 本帖最后由 xgf 于 2007-10-27 19:00 编辑 ]

顶部
 



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

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

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