woj 1036 高精

题目地址:http://acm.whu.edu.cn/learn/problem/detail?problem_id=1036

题目主要考点:数学公式推导,高精

方法一:(c++)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

string Sum(string a,string b)//这个就是高精加法,可以通用滴
{
    if(a.length()<b.length())
    {
        string temp=a; a=b; b=temp;
    }
    int i,j;
    for(i=a.length()-1,j=b.length()-1;i>=0;i--,j--)
    {
        a[i]=(a[i]+(j>=0?b[j]-'0':0));
        if(a[i]>'9')
        {
            a[i] -=10;
            if(i) a[i-1]++;
            else a='1'+a;
        }
    }
    return a;
}
int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    string a[501];
    a[1]="1"; a[2]="2"; a[3]="4";
    //cout<<a[1]<<endl<<a[2]<<endl<<a[3]<<endl;
    int n,i;
    for(i=4;i<=500;i++)//这里需要注意,设置a[501],那么只能到500,不然运行时出错,不知道为什么,求解
    {
        a[i]=Sum(a[i-1],a[i-2]);
        a[i]=Sum(a[i],a[i-3]);
    }
    while(cin>>n && n)
      cout<<a[n]<<endl;

    return 0;
}

方法二:(java)

import java.math.BigInteger;//这尼玛是一个开挂的类,不明白的可以上网查查
import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        Scanner cin=new Scanner (System.in);
        BigInteger[] dp=new BigInteger[505];
        dp[1]=new BigInteger("1");
        dp[2]=new BigInteger("2");
        dp[3]=new BigInteger("4");
        for(int i=4;i<=500;i++)
        {
            dp[i] = dp[i - 1].add(dp[i - 2].add(dp[i - 3]));}
        int n;
        while(cin.hasNext())//等价于!=EOF
        {
            n = cin.nextInt();
            if(n == 0) break;
            System.out.println(dp[n]);
        }
        }
    }

方法三:(数组设置定长,c++)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

const int LEN=134;

void add(char *b,const char *a,int lenb,int lena)
{
    int i=lenb,j=lena;
    while(i>=0)
    {
        b[i] +=a[j]-'0';
        if(b[i]>'9')
        {
            b[i] -=10;
            b[i-1]++;
        }
        i--; j--;
    }
}
int main()
{
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    int i,j,n;
    char ans[501][LEN];

    for(i=0;i<501;i++)
    for(j=0;j<LEN;j++)
    ans[i][j]='0';

    ans[1][LEN-1]='1';
    ans[2][LEN-1]='2';
    ans[3][LEN-1]='4';

    for(i=4;i<501;i++)
    {
        add(ans[i],ans[i-1],LEN-1,LEN-1);
        add(ans[i],ans[i-2],LEN-1,LEN-1);
        add(ans[i],ans[i-3],LEN-1,LEN-1);
    }

    while(cin>>n && n)
    {
        j=0;
        while(ans[n][j]=='0') j++;
        for(;j<LEN;j++) putchar(ans[n][j]);
        putchar('\n');
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daydaytech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值