1 条题解

  • 0
    @ 2025-10-10 15:45:59

    C :

    #include<stdio.h>
    int n;
    int a[3000],b[3000],c[3000];
    int main()
    {
    	scanf("%d",&n);
    	if(n==1)
    	{
    	printf("1");
    	return 0;
    	}
    	if(n==2)
    	{
    	printf("2");
    	return 0;
    	}
    	a[1]=a[0]=b[0]=1;
    	b[1]=2;
    	for(int i=3;i<=n;i++)
    	{
    		for(int j=1;j<=c[0];j++)
    		c[j]=0;
    		int t[3000];
    		for(int j=0;j<=b[0];j++)
    		t[j]=b[j];
    		for(int j=1;j<=b[0];j++)
    		{
    			b[j]*=2;
    		}
    		for(int j=1;j<=b[0];j++)
    		{
    			b[j+1]+=b[j]/10;b[j]%=10;
    		}
    		if(b[b[0]+1]!=0)	b[0]++;
    		int len=a[0]>b[0]?a[0]:b[0];
    		c[0]=len;
    		for(int j=1;j<=len;j++)
    		{
    			c[j]+=a[j]+b[j];
    			c[j+1]+=c[j]/10;
    			c[j]%=10;
    		}
    		if(c[len+1]!=0)	c[0]++;
    		for(int j=0;j<=t[0];j++)
    		a[j]=t[j];
    		for(int j=0;j<=c[0];j++)
    		b[j]=c[j];
    	}
    	for(int i=c[0];i>=1;i--)
    	printf("%d",c[i]);
    	return 0;
    }
    

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    
    //高精度求和 
    string num(string s1,string s2){
    	string r = ""; 
    	int i,len;//len存较长的长度 
    	int a[250] = {0},b[250] = {0},c[250] = {0};
    	//第一步:将2个字符数组逆序存入2个整数数组
    	//s1 = "12345";
    	for(i = 0;i < s1.size();i++){
    		//0->s1.size()-1  1->s1.size()-2
    		a[s1.size()-i-1] = s1[i] - '0';
    	} 
    	
    	for(i = 0;i < s2.size();i++){
    		b[s2.size()-i-1] = s2[i] - '0';
    	}
    	
        //第二步:逐位相加,逐位进位
        //int len = s1.size() > s2.size()?s1.size():s2.size();//三目运算符,替代if else 
    	len = s1.size();
    	if(s2.size() > s1.size()){
    		len = s2.size();
    	} 
    	
    	//加 
    	for(i = 0;i < len;i++){
    		c[i] = a[i] + b[i];
    	}
    	//进位
    	for(i = 0;i < len;i++){
    		if(c[i] >= 10){
    			c[i+1] = c[i+1] + c[i] / 10;
    			c[i] = c[i] % 10;
    		}
    	} 
    	
    	//第三步:逆序输出
    	if(c[len] != 0){
    		len++;
    	} 
    	
    	for(i = len - 1;i>=0;i--){
    		r = r + (char)(c[i] + 48);
    	}
    	return r;
    }
    
    //s1 * b的结果 
    string cheng(string s1,int b){
    	string r = "";
    	int i,p;
    	int a[1000] = {0},c[1000] = {0}; 
    	//第一步:逆序存数组
    	for(i = 0;i < s1.size();i++){
    		a[s1.size()-i-1] = s1[i] - '0';
    	} 
    	
    	//第二步:逐位相乘
    	for(i = 0;i < s1.size();i++){
    		c[i] = a[i] * b;
    	} 
    	//第三步:逐位进位
    	for(i = 0;i < s1.size() + 4;i++){
    		if(c[i] >= 10){
    			c[i+1] = c[i+1] + c[i] / 10;
    			c[i] = c[i] % 10;
    		}
    	} 
    	
    	//逆序从第一个非0输出
    	p = 0;
    	for(i = s1.size() + 4;i >= 0;i--){
    		if(c[i] != 0){
    			p = i;
    			break;
    		}
    	} 
    	
    	for(i = p;i >= 0;i--){
    		r = r + (char)(c[i] + 48); 
    	}
    	return r;
    } 
    
    int main(){
    	long long i,n;
    	string x,y,z,t;
    	cin>>n;
    	x = "1";
    	y = "2";
    	if(n == 1){
    		cout<<x<<endl;
    	}else if(n == 2){
    		cout<<y<<endl;
    	}else{
    		for(i = 3;i <= n;i++){
    			t = cheng(y,2); 
    			z = num(t,x);
    //			cout<<z<<" ";
    			x = y;
    			y = z;
    		}
    	}
    	cout<<z<<endl;
    	
        return 0;
    }
    
    

    Java :

    
    import java.util.Scanner;
    
    public class Main {
    	static String[] t = new String[1000];
    	
    	//字符串 高精度加法  
    	static String add(String a,String b){
    		String r="",t=null;
    		//保证位数较小的放b上
    		if(a.length()<b.length()){
    			t = a;
    			a = b;
    			b = t;
    		}
    		//补位
    		while(b.length()!=a.length()) b = '0' + b;
    		//两个字符串的长度 
    		int len = a.length(),i,x,y,f=0;//f表示进位 
    		for(i=len-1;i>=0;i--){
    			x = a.charAt(i) - 48;
    			y = b.charAt(i) - 48;
    			// x+y+f  接受的当前位的运算结果 
    			r = (char)((x+y+f)%10+48) + r;
    			//进位 
    			f = (x+y+f)/10; 
    		}
    		if(f>0){ //最后还存在进位 
    			r = '1' + r;
    		} 
    			return r; 
    	}	
    	
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int n = sc.nextInt();
    	 	for(int i=0;i<n;i++){
    	 		if(i==0){
    	 			t[i] = "1";
    			}else if(i==1){
    				t[i] = "2";
    			}else{
    				t[i] = add(add(t[i-1],t[i-1]),t[i-2]);
    			}
    		}
    		System.out.println(t[n-1]);
    		sc.close();
    	}
    }
    
    

    Python :

    n=int(input())
    q=1
    z=2
    h=0
    for i in range(3,n+1):
      h=q+z*2
      q=z
      z=h
    if n==1:
      print(1)
    elif n==2:
      print(2)
    else:
      print(z)
    
    • 1

    信息

    ID
    349
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者