1. 程式人生 > >JAVA高精度4_遞推求值

JAVA高精度4_遞推求值

  一開始迭代順序弄反了,a2=a3,a1=a2,a0=a1......太無腦了...因為從0開始,100-3,迴圈計算97次

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

 class Main {
    public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            
            while(in.hasNext()) {           	
            BigInteger a0 = in.nextBigInteger();
            BigInteger a1 = in.nextBigInteger();
            BigInteger a2 = in.nextBigInteger();
            BigInteger a3 = BigInteger.ZERO;
            for(int i = 1; i<=97; i++) {
            	a3 = a0.add(a1).add(a2);
            	a0 = a1;
            	a1 = a2;
            	a2 = a3;
            		
            }
            System.out.println(a2);
			
            }
            
         }
    }


用陣列套公式做也行:
import java.math.BigInteger;
import java.util.Scanner;

public class Main  
{  
    public static void main(String args[])  
    {  
        Scanner cin = new Scanner(System.in);     
        BigInteger a[] = new BigInteger[100];  
        while(cin.hasNext())  
        {  
            for(int i = 0; i <= 2; ++i)  
                a[i] = cin.nextBigInteger();  
            for(int i = 3; i <= 99; ++i)  
                a[i] = a[i - 1].add(a[i - 2]).add(a[i - 3]);  
            System.out.println(a[99]);  
        }  
    }  
}  

C/C++版:

也就是把數位存進數組裡面,思路迭代和第一中Java一樣:

#include <stdio.h>
#include <string.h>
#define MAX 1010
int a[MAX],b[MAX],c[MAX],sum[MAX];
void init(int x,int *a)
{
    int i=0;
    while(x)
    {
        a[i++]=x%10;
        x/=10;
    }
}
int main()
{
    int aa,bb,cc;
    while(scanf("%d %d %d",&aa,&bb,&cc)!=EOF)
    {
        int i,j,t;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        memset(c,0,sizeof(c));
        init(aa,a);init(bb,b);init(cc,c);
        /*if(aa==0&&bb==0&&cc==0)
        {
            printf("0\n");
            continue;
        }*/
        //for(i=0;i<10;i++)
        //printf("%d %d %d ",a[i],b[i],c[i]);
        for(i=3;i<=99;i++)
        {
            memset(sum,0,sizeof(sum));
            for(j=0;j<MAX;j++)
            {
                sum[j]+=(a[j]+b[j]+c[j]);
                if(sum[j]>9)
                {
                    t=sum[j];
                    sum[j]=t%10;
                    sum[j+1]=t/10;
                }
            }
            for(j=0;j<MAX;j++)
            {
                a[j]=b[j];
                b[j]=c[j];
                c[j]=sum[j];
            }
        }
        for(j=MAX-1;j>0&&sum[j]==0;j--);
        for(;j>=0;j--)
        printf("%d",sum[j]);
        printf("\n");
    }
    return 0;
}


相關推薦

JAVA精度4_

  一開始迭代順序弄反了,a2=a3,a1=a2,a0=a1......太無腦了...因為從0開始,100-3,迴圈計算97次 import java.math.BigInteger; impor

NYOJ 301 【矩陣快速冪取模】

遞推求值 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4 描述 給你一個遞推公式: f(x)=a*f(x-2)+b*f(x-1)+c 並給你f(1),f(2

藍橋杯演算法提高——(矩陣快速冪)

問題描述   已知遞推公式:   F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5,   F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3.   初始值為:F(1, 1)=2, F(1,

演算法提高 (C程式碼只有50分, 附上答案C++程式碼,看起來比較吃力)

問題描述   已知遞推公式:   F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5,   F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3.   初始值為:F(1, 1)=2, F(1, 2)=3, F(

2016年ACM/ICPC大連賽區 C題(JAVA精度sqrt(5)+威佐夫博弈)

題目連結:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5747 題意:除了資料範圍為10^100次方以外

JAVA精度_精度

要想用Java輕快的水過這道題,要先了解下JAVA.math中的幾個方法 1.Java.math.BigDecimal.toPlainString() 返回此BigDecimal的字串表示形式不帶指數字段。 例如來個小對比:函式 toPlainString() 和 t

poj 2096 Collecting Bugs 【概率DP】【逆向期望】

tdi cor ros quick -a sim total 3.0 pla Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions

新疆大學ACM-ICPC程序設計競賽五月月賽(同步賽)F 猴子排序的期望【Java/精度/組合數學+概率論】

keyset 競賽 turn ext ID return 組合數學 AS vid 鏈接:https://www.nowcoder.com/acm/contest/116/F 來源:牛客網 題目描述 我們知道有一種神奇的排序方法叫做猴子排序,就是把待排序的數字寫在卡片上,

028_shell腳本

AS lse reference enc exp 階乘計算 number true scripting 一、 #!/bin/sh factorial() { if [ "$1" -gt "1" ]; then i=`expr $1 - 1` j=`fa

【HDOJ6222】Heron and His Triangle(Java,二分,

ret 直接 for out ext n-1 multipl system angle 題意:讓你找這樣的一個三角形,三條邊為t,t-1,t+1,並且面積為整數,最後滿足t大於等於n。 n<=1e30 思路:直接推式子不會,打表找規律 f(n)=4*f(n-1)-f(

精度算法_組和

精度 r+ bits out 題目 ace ans sin include 題目原型是洛谷的P1771 #include<bits/stdc++.h> using namespace std; int k,x; int a[100]; int ans; int

JAVA精度演算法 BigInteger用法詳解 大數四則運算

在用C或者C++處理大數時感覺非常麻煩,但是在Java中有兩個類BigInteger和BigDecimal分別表示大整數類和大浮點數類,至於兩個類的物件能表示最大範圍不清楚,理論上能夠表示無線大的數,只要計算機記憶體足夠大。 這兩個類都在java.math.*包中,因此每次必須在開頭處引用該包。

階乘

/*用遞推法求階乘*/ #include <stdio.h> int main() { long fac(int n);//使用前需要宣告 int n; long fact=0;// printf("please input a interger number:\n

java資料結構】解決的漢諾塔問題

在學習資料結構的時候,遇到漢諾塔問題,就寫了自己的理解,希望對您有幫助。 package com.qxlx.six; /** * 遞推解決的漢諾塔問題 * * @author jia * */ public class TowerApp { public

Java面向物件——用斐波那契數列

1.用非遞迴方式求斐波那契數列: package Hello; public class Test { public static void main(String[] args) {

Java精度計算

import java.util.Scanner;import java.math.BigDecimal;public class Main{ public static void main(String[] args) { Scanner cin = new Scanner(System.in); Bi

逆元 逆元

其實有些題需要用到1-p模p的所有逆元,這裡p為奇質數。那麼如果用快速冪求時間複雜度為O(p log(p)), 如果對於一個1000000級別的素數,這樣做的時間複雜度是很高了。實際上有的演算法,有一

大資料階乘運算-java精度運算

import java.math.BigDecimal; /**  * 高精度運算  * @author RSun  * @Date 2012-11-7下午11:22:04  */ public class TestBigInteger {

JAVA 精度加法

import java.math.BigInteger; import java.util.Scanner; public class Main { public static void ma

Java 精度的大數字運算

      為了解決Java基本資料型別在運算時會出現的溢位和計算不精確的問題。Java 提供了兩個類BigInteger和BigDecimal,專門用於進行高精度運算。凡是能用int 或float 做的事情,用BigInteger和BigDecimal也可以做,只是必須