【数学类】牛客 整数拆分、【大数】N的阶乘、大整数的因子、a+b、大整数排序

题目描述

一个整数总可以拆分为2的幂的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 7=1+1+1+2+2 7=1+1+1+1+1+2 7=1+1+1+1+1+1+1 总共有六种不同的拆分方式。 再比如:4可以拆分成:4 = 4,4 = 1 + 1 + 1 + 1,4 = 2 + 2,4=1+1+2。 用f(n)表示n的不同拆分的种数,例如f(7)=6. 要求编写程序,读入n(不超过1000000),输出f(n)%1000000000。

输入描述:

每组输入包括一个整数:N(1<=N<=1000000)。

输出描述:

对于每组数据,输出f(n)%1000000000。

示例1

输入

复制

7

输出

复制

6

#include <stdio.h>
#include <cstdio>
#include <string>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
using namespace std;
long long dp[1000001];
int main(){
    dp[0]=1;
    dp[1]=1;
    for(int i=2;i<1000001;i++)
    {
        if(i%2==0)
           dp[i]=(dp[i-1]+dp[i/2])%1000000000;
            
        else
            dp[i]=dp[i-1];
    }
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        long long ans=dp[n];
        printf("%lld\n",ans);
    }
}

 

题目描述

 输入一个正整数N,输出N的阶乘。

输入描述:

正整数N(0<=N<=1000)

输出描述:

 输入可能包括多组数据,对于每一组输入数据,输出N的阶乘

示例1

输入

复制

4
5
15

输出

复制

24
120
1307674368000

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
public static void main(String []args)
{
    Scanner in=new Scanner(System.in);
    int n=in.nextInt();
    BigInteger b = BigInteger.ONE;
    for(int i=n;i>=2;i--)
    {
        b=b.multiply(BigInteger.valueOf(i));
    }
    System.out.println(b);
}
}

 

题目描述

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

输入描述:

若干个非负整数c,c的位数<=30
每行一个c

输出描述:

每一个c的结果占一行
1) 若存在满足 c%k == 0 的k,输出所有这样的k,中间用空格隔开,最后一个k后面没有空格。
2) 若没有这样的k则输出"none"

注意整数溢出问题
不要对-1进行计算

示例1

输入

复制

30
72
13

输出

复制

2 3 5 6
2 3 4 6 8 9
none

 

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        BigInteger c;
        Scanner in = new Scanner(System.in);
        c = in.nextBigInteger();
        BigInteger k = new BigInteger("2");
        BigInteger o = new BigInteger("1");
        BigInteger z = new BigInteger("0");
        BigInteger k2 = new BigInteger("10");
        BigInteger[] str = new BigInteger[30];
        int i = 0;
        while (k.equals(k2) == false) {
            BigInteger x=c.mod(k);
            //System.out.println(c);
            //System.out.println(k);
            //System.out.println(x);
            if (x.equals(z)==true) {
                str[i++] = k;
            }
            k=k.add(o);
            //System.out.println(k);
        }
        if (i!= 0) {
            for (int j = 0; j < i; j++) {
                if(j!=i-1)
                System.out.print(str[j]+" ");
                else
                System.out.print(str[j]);    
            }
            System.out.println();
        } else {
            System.out.println("none");
        }
    }
}

 

题目描述

实现一个加法器,使其能够输出a+b的值。

输入描述:

输入包括两个数a和b,其中a和b的位数不超过1000位。

输出描述:

可能有多组测试数据,对于每组数据,
输出a+b的值。

示例1

输入

复制

2 6
10000000000000000000 10000000000000000000000000000000

输出

复制

8
10000000000010000000000000000000

//package F;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        BigInteger a,b;
        a=in.nextBigInteger();
        b=in.nextBigInteger();
        BigInteger c=new BigInteger("0");
        c=a.add(b);
        System.out.print(c);
        System.out.println();
    }
}

 

题目描述

对N个长度最长可达到1000的数进行排序。

输入描述:

输入第一行为一个整数N,(1<=N<=100)。
接下来的N行每行有一个数,数的长度范围为1<=len<=1000。
每个数都是一个正数,并且保证不包含前缀零。

输出描述:

可能有多组测试数据,对于每组数据,将给出的N个数从小到大进行排序,输出排序后的结果,每个数占一行。

示例1

输入

复制

3
11111111111111111111111111111
2222222222222222222222222222222222
33333333

输出

复制

33333333
11111111111111111111111111111
2222222222222222222222222222222222

//package F;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n;
        n=in.nextInt();
        BigInteger []str=new BigInteger[101];
        for(int i=0;i<n;i++)
        {
            str[i]=in.nextBigInteger();
        }
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                if(str[i].compareTo(str[j])==1)
                {
                    BigInteger t=str[j];
                    str[j]=str[i];
                    str[i]=t;
                }
            }
        }
        for(int i=0;i<n;i++)
        {
            System.out.print(str[i]);
            System.out.println();
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值