zoukankan      html  css  js  c++  java
  • 2980 大整数乘法

    题目来源:
    http://bailian.openjudge.cn/practice/2980/
    描述
    求两个不超过200位的非负整数的积。
    输入
    有两行,每行是一个不超过200位的非负整数,没有多余的前导0。
    输出
    一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
    样例输入
    12345678900
    98765432100
    样例输出
    1219326311126352690000
    题意描述:
    计算两个位数不超过200的非负整数的乘积
    解题思路:
    先将str1和str2逆置
    根据规律计算,再统一处理进位
    去除前导零输出即可
    程序代码:

     1 #include<stdio.h>
     2 const int N=230;
     3 #include<string.h>
     4 int main()
     5 {
     6     char str1[N],str2[N];
     7     int  a[N],b[N],result[2*N],i,j,k,l1,l2;
     8     while(scanf("%s%s",str1,str2) != EOF)
     9     {
    10         l1=strlen(str1);
    11         l2=strlen(str2);
    12         for(j=0,i=l1-1;i>=0;i--) 
    13             a[j++]=str1[i]-'0';
    14         for(j=0,i=l2-1;i>=0;i--)
    15             b[j++]=str2[i]-'0';
    16         //乘积 
    17         memset(result,0,sizeof(result));
    18         for(i=0;i<l1;i++) 
    19             for(j=0;j<l2;j++)
    20                 result[i+j] += a[i]*b[j];
    21         //处理进位
    22         for(i=0;i<N*2;i++) {
    23             if(result[i] > 9)//先计算进位,否则前面的值先改变,不能进位 
    24             {
    25                 result[i+1] += result[i] / 10 ;
    26                 result[i]   %= 10;
    27             }
    28         } 
    29          //输出 
    30          for(i=2*N-1;i>=0;i--)//注意计数变量的自增与自减 ,i的初始值为2倍的再减1 
    31          {
    32              if( result[i] != 0 )
    33              break;
    34          }
    35          for(j=i;j>=1;j--)
    36              printf("%d",result[j]);
    37          printf("%d
    ",result[0]);
    38     }
    39     return 0;
    40 } 


    易错分析:
    1、注意数组越界(2*N-1处)

  • 相关阅读:
    Oracle
    Windows
    Ajax
    Ext JS
    JavaScript
    Linux中查看各文件夹大小命令du
    本地文件上传到Linux服务器的几种方法
    Mysql线程状态
    把mysql里面的一些状态输出到文件里面显示
    linux修改磁盘调度方法
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/6883607.html
Copyright © 2011-2022 走看看