UOJ Logo UOJ_Vixbob的博客

博客

标签

N的阶乘和

2017-08-09 18:32:03 By UOJ_Vixbob

高精度:N的阶乘和

总时间限制: 1000ms 内存限制: 65536kB

描述

用高精度计算出S=1!+2!+3!+…+n!(n≤50)

其中“!”表示阶乘,例如:5!=54321。

输入正整数N,输出计算结果S。

输入

一个正整数N。

输出

计算结果S。

样例输入

5

样例输出

153

来源

NOIP1998复赛 普及组 第二题

原题出处:OPJ

解题思路:用两个数组,两个数组尽量开大一点,一个用来存每一次的阶乘值,另一个用来存和,每一次不断累加

代码如下

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int a[40000],S[40000];
int main()
{
    int n,i,j,sum=1,sum1=1,f=0,t;
    a[0]=1;
    scanf("%d",&n);
    if(n>=1)
    {
        for(i=1;i<=n;i++)
        {
            for(j=0;j<sum;j++)
                a[j]=a[j]*i;
            for(j=0;j<sum;j++)
                if(a[j]>=10)
                {
                    a[j+1]=a[j+1]+a[j]/10;
                    a[j]=a[j]%10;
                    if(j+1==sum)sum++;
                }
            for(j=0;j<sum1+10;j++)
                S[j]=S[j]+a[j];
            for(j=0;j<sum1+10;j++)
                if(S[j]>=10)
                {
                    S[j+1]=S[j+1]+S[j]/10;
                    S[j]=S[j]%10;
                    if(j+1==sum1)sum1++;
                }
        }
        for(j=sum1+20;j>=0;j--)
        {
            if(f==0)
            {
                if(S[j]==0);
                else {printf("%d",S[j]);f=1;t=j;}
            }
            if(f==1&&f==1&&t!=j)printf("%d",S[j]);
        }
    }
    else printf("0");
    return 0;
}

大整数的因子

2017-08-09 13:38:40 By UOJ_Vixbob

题目:

描述

已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。

输入

一个非负整数c,c的位数<=30。

输出

若存在满足 c%k == 0 的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。

样例输入

30

样例输出

2 3 5 6

解题思路:

这道题的的思路类似大整数除法,和我们小学时学的除法的思路类似,只是除数有了范围2~9而已

内附代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    char a[100];
       gets(a);
    int f=0,t=0,i,j;
    for(j=2;j<=9;j++)
    {
           t=0;
           for(i=0;i<strlen(a);i++)
           {
               if(a[i]-'0'+t>=j)
            t=(a[i]-'0'+t)%j*10;
               else t=(a[i]-'0'+t)*10;
        }
           if(t==0)
           {
               printf("%d ",j);
               f=1;
           }
       }
       if(f==0)printf("none");
       return 0;   
}
共 2 篇博客