zoukankan      html  css  js  c++  java
  • HDU1042 N! 大数乘法 (C语言)

    这是一道简单的数学题,求一个数(N)的阶乘。但是问题是题中N给的非常大(0<=N<=10000),用for循环来做显然不行了。这里用数组来对付这些大家伙。基本思路如下:

      1.开辟一个够大的数组,保证大于1000!所占的位数,我是以最大情况来估算,即1000个1000相乘,开一百万吧,反正我们老大(Miyu)说了数组空间烂便宜。

      2.然后就是挨个来乘了(说白了,就是模拟我们平时的乘法),这里不要惯性的只要看见某位过10便想着进位,虽然这样能做,但艰难。可以让一位存大一点的数值,要知道,对于每一位来说,可以存下一个21亿的数字。

      3.如果只是乘,不中途处理一次进位的话,那便永远是在“个位”做乘法了,肯定不行,于是我们每乘2次处理一次进位(理由见代码注释),这样变可解决这个问题了。

    代码如下:

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h> 
    #define MAX 1000000 
    int N,p,res[MAX+1];
     
     
    int main()
    {
    	while(scanf("%d",&N)!=EOF)
    	{  
    		p=MAX;                      //定义P为最高位指针. 
    		memset(res,0,sizeof(res));  //初始化数组 
    		res[MAX]=1;                 //由于是乘法,初始化为 1 ,这样0!也就为 1 了 
    		for(int i=2;i<=N;++i)
    		{ 
    			p-=4;                   //由于 Lvsi 同志觉得做题目应不止满足于做出 
    			for(int j=MAX;j>=p;--j) //所以改进了一下,由 [MAX->0] 改为每次乘后 
    				res[j]*=i;    //开辟四位进位空间,根据乘以最大数10000而来.
    			 
    			  
    			if(i%2==0||i==N)	//让它乘两次处理一次进位,即把每位更新成9以下 
    			{			   //如果%3的话想想连乘 998 999 1000 之类的肯定,溢出了. 
    				for(int j=MAX;j>=p;--j) //最后进位是必须的   
    				{
    					int c=res[j]/10;
    					res[j]%=10;
    					res[j-1]+=c;
    				} 
    			}
    		}
    		
    		for(int i=0;i<=MAX;++i)  //清除前置的零. 
    		{
    			if(res[i]!=0)
    			{
    				p=i;
    				break;
    			}
    		} 
    		for(int i=p;i<=MAX;++i)
    			printf("%d",res[i]);
    		puts("");
    	}
        //system("pause");
        return 0;
    }
    

      提交用了875MS,努力努力。

  • 相关阅读:
    python学习--函数
    python学习--变量
    python学习--运算符
    python学习--数据类型
    python学习--循环语句
    年轻不言失败
    《zero to one》读后感
    进程与线程
    JS----模块化
    js 一个等号"=" 二个等号"==" 三个等号"===" object.is()的区别
  • 原文地址:https://www.cnblogs.com/Lyush/p/1999095.html
Copyright © 2011-2022 走看看