• 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 调优3
    ifconfig找不到命令的帖子 精选
    执行计划中各字段各模块描述
    oracle统计信息
    oracle中 rownum与rowid的理
    触发器
    开园第一天
    Asp.net生成htm静态文件的两种途径
    避免刷新页面,自动跳回到页面顶部的办法
    ASP.NET二级域名站点共享Session状态
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/6883607.html
Copyright © 2020-2023  润新知