ZOJ 2529 题解

    题目链接

    又是一道CYJJ出的题目,比较有意思。

    题目的意思是给出两个数,做A+B运算,当然这可不是1001,这两个数的表示方法不简单,每一位的进制不同,从右向左,第i位的进制我第i个素数,比 如"1,0"表示的十进制数字是2,因为第一位是0,进位到第二位了,于是就是2,比如"1,0,0",就是6了,经过两次进位到了进制是5的一位,题目 看懂了做起来就简单了,以前看好几遍一直不知道题目讲的是什么,当然,这可不是CYJJ的错,只是我的英语水平差啦。。

    看上去好像是要大数表示法去做,其实不用,在一位一位的进行处理就行了,第i位的加法是第i位的两个数字a,b相加,再加上前面得到的进位co,得到一个 sum,将sum除prime[i]取余就是结果的第i位,sum除以prime[i]就是下一个进位,这样不断的做下去,直到做完为止。这倒是跟逻辑计 算机中的串行进位加法器有点像,呵呵。

    附上代码:in C++


ExpandedBlockStart.gif 代码
 1  #include < iostream >
 2  #include < string >
 3  #include < vector >
 4  #include < algorithm >
 5  #include < stack >
 6  #include < cstdio >
 7  using   namespace  std;
 8 
 9  int  main()
10  {
11  stack < int >  va,vb;
12  int  num ;
13  char  c ;
14  int  p[] = { 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 , 73 , 79 , 83 , 89 , 97 };
15 
16  while (scanf( " %d " , & num)  !=  EOF)
17  {
18     va.push(num);
19     c  =  getchar();
20      while (c  ==   ' , ' )
21     {
22      scanf( " %d " , & num);
23      va.push(num);
24      c  =  getchar();
25     }
26     scanf( " %d " , & num);
27     vb.push(num);
28     c  =  getchar();
29      while (c  ==   ' , ' )
30     {
31      scanf( " %d " , & num);
32      vb.push(num);
33      c  =  getchar();
34     }
35      int  n  =  max(va.size(),vb.size());
36     stack < int >  res;
37      int  co  =   0 ;
38      int  a , b ;
39      for ( int  i  =   0  ; i  <  n ; i  ++ )
40     {
41       if ( ! va.empty())
42      {
43       a  =  va.top();
44       va.pop();
45      }
46       else  a  =   0 ;
47       if ( ! vb.empty())
48      {
49       b  =  vb.top();
50       vb.pop();
51      }
52       else  b  =   0 ;   
53       int  sum  =  a  +  b  +  co;
54      res.push(sum  %  p[i]);
55      co  =  sum  /  p[i] ;
56     }
57      for ( int  i  =  n ; co  !=   0  ; i  ++ )
58     {
59      res.push(co  %  p[i]);
60      co  =  co  /  p[i] ;
61     }
62     cout << res.top();
63     res.pop();
64      while ( ! res.empty())
65     {
66      cout << " , " << res.top();
67      res.pop();
68     }
69     cout << endl;
70  }
71 
72  return   0 ;
73  }


转载于:https://www.cnblogs.com/vivyli/archive/2010/02/05/1664065.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值