C++从入门到入土-4.14下午的测试n!!道题(乘法篇)

从此走上不归路…

一、高精度乘法


耿直给代码:

//高精度乘法 
#include<cstdio>
#include<cstring>
int main() {
    char num1[1500], num2[1500];
    scanf("%s%s", num1, num2);
    int n = strlen(num1), m = strlen(num2);
    int a[n], b[m];
    int i, j;
    for (i = 0, j = n - 1; i < n; i++, j--) {
        a[i] = num1[j] - '0';
    }
    for (i = 0, j = m - 1; i < m; i++, j--) {
        b[i] = num2[j] - '0';
    }
    int c[3000];
    for (i = 0; i < 3000; i++) {
        c[i] = 0;
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) {
            c[i + j] += a[i] * b[j];
        }
    }   
    for (i = 0; i < n + m; i++) {
        if (c[i] >= 10) {
            c[i + 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
    for (j = 2999; j > 0; j--) {
        if (c[j] != 0)
        break;
    }
    for (i = j; i >= 0; i--) {
    printf("%d", c[i]);
    }
    printf("\n");
    return 0;
}



二、求N!的值(高精度)



源代码:

//求N!的值 
#include<cstdio>
#include<iostream>
#define maxn 5555
using namespace std;
int f[maxn];
int main()
{
	freopen("ni.in","r",stdin);
	freopen("ni.out","w",stdout);
	int n;
	cin>>n;//输入
	memset(f,0,sizeof(f));//初始化
	f[1]=1;//f保存被乘数,每一次运算成果
	for(int i=2;i<=n;i++)
	{
		int c=0;
		for(int j=1;j<=maxn;j++)
		{
			int s=f[j]*i+c;
			f[j]=s%10;
			c=s/10;
		}
	}
	int beg;
	for(beg=maxn;beg>=1;--beg)
		if(f[beg])
			break;
	for(int i=beg;i>=1;i--) 
		cout<<f[i];
	fclose(stdin);
	fclose(stdout);
	return 0;
} 

三、阶乘和(高精度)

扫描二维码关注公众号,回复: 775163 查看本文章


代码:

//阶乘和 
#include<cstdio>
#include<iostream>
#define maxn 30001
using namespace std;
int s[maxn]={0},a[maxn]={0,1};
int main()
{
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	int i,n,al=1,j,sl=1,k,l=1,v=1;
	cin>>n;//输入
	a[0]=1;s[0]=1;
	
	if(n==1)
		printf("%d\n",s[0]);//为1 则阶乘和为1 
	for(int k=1;k<=n;k++)
	{
		for(j=1;j<=al;j++)
			a[j]*=l;
		for(j=1;j<=al;j++)
		{
			if(a[j]>=10)//处理进位 
			{
				a[j+1]+=a[j]/10;
				a[j]%=10;
				v++;
			}
		}
		al++;
		while(a[al]>=10)//处理最高位
		{
			a[al+1]=a[al]/10;
			a[al]%=10;
			al++;
			v++;
		}
		l++;
		sl=sl>al?sl:al;
		
		for(i=1;i<=sl;i++)
		{
			s[i]+=a[i];
			if(s[i]>=10)
			{
				if(i==sl)
					sl++;
				s[i]%=10;
				s[i+1]++;
			}
		}	
		al=v;
	}
	for(i=sl;i>=1;i--)//去除前导0
	{
		if(s[i]==0&&sl>1)
			sl--;
		else
			break;
	}
	for(i=sl;i>=1;i--)
		printf("%d",s[i]);
	fclose(stdin);
	fclose(stdout);
	return 0;
} 

…我已经没有动力做完九道题了

四、万进制计算N!精确值(高精度)


代码如下:

#include<cstdio>  
#include<cstring>  
#define max 8001  
unsigned n,a[max];  
int main()  
{  
	freopen("ni.in","r",stdin);
	freopen("ni.out","w",stdout);
    int i,j;  
    scanf("%d",&n);
    memset(a,0,sizeof(a));  
    for(i=2,a[0]=1;i<=n;i++)  
    {  
        for(j=0;j<max;j++) a[j]*=i;  
        for(j=0;j<max;j++)  
        {  
            a[j+1]+=a[j]/100000;  
            a[j]%=100000;  
        }  
    }  
    for(i=max-1;i>=0&&!a[i];i--);  
    printf("%d",a[i--]);  
    for(;i>=0;i--) printf("%05d",a[i]);  
    printf("\n");  

    return 0;  
}  

猜你喜欢

转载自blog.csdn.net/qq_41993986/article/details/79939703