一个觉得很难的C语言问题。对两个数字字符串相加。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个觉得很难的C语言问题。对两个数字字符串相加。相关的知识,希望对你有一定的参考价值。

有定义:char s1[200],s2[200],s3[200];
s3存放s1与s2相加后的结果。

样例一:
输入:
999999999999999999999
999999999999999999999
输出
1999999999999999999998

样例二:
输入:
1234567890123456789
876543211
输出:
1234567891000000000

很难才10分啊

#include<stdio.h>
#include<string.h>
int main()

int i,t,j=1,n,len,k;
char sum[1009],sa[1009],sb[1009];
scanf("%d",&t);
getchar();
while(t--)

for(i=0;i<1009;i++)
sum[i]=\'0\';
scanf("%s%s",sa,sb);
len=strlen(sa);
for(i=len-1,k=0;i>=0;i--,k++)

sum[k]=sum[k]-\'0\'+sa[i];
n=k;
while(sum[n]>\'9\')

sum[n+1]=sum[n+1]+(sum[n]-\'0\')/10;
sum[n]=(sum[n]-\'0\')%10+\'0\';
n++;


len=strlen(sb);
for(i=len-1,k=0;i>=0;k++,i--)

sum[k]=sum[k]-\'0\'+sb[i];
n=k;
while(sum[n]>\'9\')

sum[n+1]=sum[n+1]+(sum[n]-\'0\')/10;
sum[n]=(sum[n]-\'0\')%10+\'0\';
n++;


printf("Case %d:\\n%s + %s = ",j,sa,sb);
j++;
for(i=1008;sum[i]==\'0\';i--);
for(;i>=0;i--)
printf("%c",sum[i]);
printf("\\n");
if(t>0)
printf("\\n");

return 0;

参考技术A

把两个数字字符串都转换成数字类型直接相加就可以了


在C语言中的stdlib.h头文件中提供了现成的字符串转数字的函数atoi。但是要注意,两个数字字符串必须都是合法的数字格式。如果是小数,可以用atof函数,使用方法跟atoi类似。具体请参考:

http://baike.baidu.com/link?url=0EMXyMfOxMyaQnC5E1YQRQzMeFmM1w7n-9t9k5QhVDhW9bbNPxEdsR174hxXFCjWfIvOXoFR9J5wratcssTLlK

#include <stdlib.h>
#include <stdio.h>
int main()

    char a[] = "-100"; 
    char b[] = "123"; 
    int c; 
    c = atoi(a) + atoi(b);
    printf("c=%d\\n", c);
    return 0;

执行结果:

c = 23

以上转自百度百科(上面提供的链接)

参考技术B 参见之前的回答
http://zhidao.baidu.com/question/518661709

思路是用3个栈A,B,C,把s1和s2各个字符分别压到A、B栈,第三个栈C存结果。

分别把A、B的栈顶元素pop出来做运算,然后压入C中。

最后C元素依次出栈就是结果。
参考技术C 其实就是把字符串变成int 然后相加追问

int不行,int的最大值为2147483647,位数是10位,当我对长度超过10进行相加操作,就不行了。比如我要对一个长度为60位的数字进行相加。还能转换成int吗。double都不行

参考技术D 和无助,然而为了生佣工 活,我们雪又多少夺主

将两个数字相乘然后相加

【中文标题】将两个数字相乘然后相加【英文标题】:Multiply 2 numbers and then sum 【发布时间】:2010-10-01 00:31:38 【问题描述】:

我很难尝试做一些看起来应该很容易做的事情。我基本上想将一个节点中的 2 个数字相乘,然后将所有节点的这些数字相加。这是我尝试过的 XSLT 代码。

<xsl:value-of select="sum(Parts/Part/Quantity * Parts/Part/Rate)"/>

此代码导致错误提示“函数 sum 的参数 1 无法转换为节点集”。

有没有人知道哪里出了问题或者我如何才能完成我想做的事情?

【问题讨论】:

你应该提到足够的细节..以便其他人能想到帮助你..应该提到 XSLT 版本、处理器(saxon 或其他)或@Least 软件(Visual Studio/Altova XML Spy) .. 【参考方案1】:

以下是三种可能的解决方案

解决方案 1 XSLT2:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

    <xsl:template match="/">
      <xsl:sequence select="sum(/*/*/(rate * quantity))"/>
    </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时

<parts>
  <part>
        <rate>0.37</rate>
    <quantity>10</quantity>
  </part>
  <part>
        <rate>0.03</rate>
    <quantity>10</quantity>
  </part>
</parts>

产生想要的结果

4

XSLT 2.0 解决方案使用了这样一个事实:在XPath 2.0 中,允许最后一个“/”运算符的右参数可以是表达式或通常是函数。这个表达式/函数被应用到目前选择的作为上下文节点的每个节点,每个函数应用都会产生一个结果。

解决方案2 XSLT 1.0:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

    <xsl:template match="/">
      <xsl:call-template name="sumProducts">
        <xsl:with-param name="pList" select="*/*"/>
      </xsl:call-template>
    </xsl:template>

    <xsl:template name="sumProducts">
        <xsl:param name="pList"/>
        <xsl:param name="pAccum" select="0"/>

        <xsl:choose>
          <xsl:when test="$pList">
            <xsl:variable name="vHead" select="$pList[1]"/>

            <xsl:call-template name="sumProducts">
              <xsl:with-param name="pList" select="$pList[position() > 1]"/>
              <xsl:with-param name="pAccum"
               select="$pAccum + $vHead/rate * $vHead/quantity"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="$pAccum"/>
          </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

当应用于上述 XML 文档时,会产生正确的结果

4

这是一个典型的 XSLT 1.0 递归解决方案请注意sumProducts 模板如何递归调用自身,直到处理传入参数$pList 的整个输入列表。

解决方案 3 FXSL (XSLT 1.0):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
xmlns:test-map-product="test-map-product"
exclude-result-prefixes="xsl ext test-map-product"
>
   <xsl:import href="sum.xsl"/>
   <xsl:import href="map.xsl"/>
   <xsl:import href="product.xsl"/>

   <!-- This transformation is to be applied on:
        salesMap.xml

        It contains the code of the "sum of products" from the 
        article "The Functional Programming Language XSLT"
     -->

   <test-map-product:test-map-product/>

   <xsl:output method="text"/>

   <xsl:template match="/">
     <!-- Get: map product /sales/sale -->
     <xsl:variable name="vSalesTotals">
         <xsl:variable name="vTestMap" select="document('')/*/test-map-product:*[1]"/>
         <xsl:call-template name="map">
           <xsl:with-param name="pFun" select="$vTestMap"/>
           <xsl:with-param name="pList1" select="/sales/sale"/>
         </xsl:call-template>
     </xsl:variable>

     <!-- Get sum map product /sales/sale -->
      <xsl:call-template name="sum">
        <xsl:with-param name="pList" select="ext:node-set($vSalesTotals)/*"/>
      </xsl:call-template>
   </xsl:template>

    <xsl:template name="makeproduct" match="*[namespace-uri() = 'test-map-product']">
      <xsl:param name="arg1"/>

      <xsl:call-template name="product">
        <xsl:with-param name="pList" select="$arg1/*"/>
      </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 XML 文档时

<sales>
  <sale>
    <price>3.5</price>
    <quantity>2</quantity>
    <Discount>0.75</Discount>
    <Discount>0.80</Discount>
    <Discount>0.90</Discount>
  </sale>
  <sale>
    <price>3.5</price>
    <quantity>2</quantity>
    <Discount>0.75</Discount>
    <Discount>0.80</Discount>
    <Discount>0.90</Discount>
  </sale>
</sales>

产生正确的结果

7.5600000000000005

在最后一种情况下,对于每个sale,我们计算pricequantity 和所有可用(可变数量)discount-s 的乘积。

FXSL 是高阶函数的纯 XSLT 实现。在此示例中,使用高阶函数 f:map() 将函数 f:product() 映射到每个 sale 元素的子列表中。然后将结果相加得出最终结果。

【讨论】:

谢谢。解决方案 #2 正是我创建聚合乘法函数所需要的。 @infant-programmer:感谢您的赞赏!如果你喜欢这个,你会喜欢我博客上的很多东西:dnovatchev.spaces.live.com/Blog【参考方案2】:

Dimitre 的所有解决方案都有效,他说得对,您需要使用扩展功能,但有时它会让生活更轻松。这并不太有害,尤其是当您使用跨多个 XSLT 处理器支持的 exslt 扩展时。此外,您收到序列错误的原因可能是因为您使用的是 XSLT 1 处理器。

如果您想坚持使用您选择的解决方案,则需要使用 Saxon 或其他一些支持 XSLT 2 的 XSLT 处理器。

否则,这是在 XSLT 1 中执行此操作的另一种方法。这将适用于大多数 XSLT 处理器,并且某些人可能会发现它比递归版本更容易理解。就个人而言,我更喜欢递归版本(Dimitre 的第三个提案),因为它更便携。

<xsl:stylesheet version="1.0"
                xmlns:ex="http://exslt.org/common"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>

  <xsl:template name="GetProducts">
    <xsl:param name="left"/>
    <xsl:param name="right"/>

    <xsl:for-each select="$left/text()">
      <product>
        <xsl:value-of select="number(.) * number($right[position()])"/>
      </product>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="/">
    <xsl:variable name="products">
      <xsl:call-template name="GetProducts">
        <xsl:with-param name="left" select="Parts/Part/Rate"/>
        <xsl:with-param name="right" select="Parts/Part/Quantity"/>
      </xsl:call-template>
    </xsl:variable>

    <xsl:value-of select="sum(ex:node-set($products)/product)"/>
  </xsl:template>
</xsl:stylesheet>

【讨论】:

以上是关于一个觉得很难的C语言问题。对两个数字字符串相加。的主要内容,如果未能解决你的问题,请参考以下文章

c语言一串字符串中提取数字并相加的问题

汇编语言中的加减法~~~~~~~~~困扰我很久了。。有高人吗

c语言数组内元素相加?

C语言 字符串转数字 急急急

企业数字化转型最难的是什么?就这两个字

c语言中将一个数组中,相邻得元素俩俩相加找出最大得组合