1 条题解
-
0
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
- 上传者