求解!!!!

题目描述

奶牛们发现了Fibonacci数列:1,1,2,3,5,8,13,21,34,…即下一个元素是前两个元素之和(这个数列是从1,1开始的)。
不幸的是,愚蠢的牛没有发明空格这个字符,因此把这个数列记录下来时,数之间没有标点或空格,就像这样:112358132134…
但是这是一个有趣的问题。给出数列的前两个元素(都是正整数且小于100),计算数列的第K位(1<=K<=500)。保证你遇到的数列中的每一个数都是一个长整型数。

输入格式:

单独的一行,有三个空格隔开的整数:cowfib数列的第一个数,cowfib数列的第二个数,K。

输出格式:

单独的一行,一个数字表示指定序列的第K位的数字

样例输入:

1 1 10

样例输出:

1

数据范围:

1<=K<=500
给出元素小于100

时间限制:

1000

空间限制:

65536
代码如下
#include<bits/stdc++.h>
using namespace std;
int main() {
long long n,m,k,cnt=1;
cin>>n>>m>>k;
long long s=n,k1=m;
while(s){
cnt++;
if(cnt==k){
cout<<s%10;
return 0;
}
s/=10;
}
while(k1){
cnt++;
if(cnt==k){
cout<<k1%10;
return 0;
}
k1/=10;
}
long long s1=n,s2=m;
for(int i=1;i<=k;i++){
s1=n+m;
n=m;
m=s1;
long long w=s1;
while(w){
cnt++;
if(cnt==k){
cout<<w%10;
return 0;
}
w/=10;
}
}
return 0;
}

1 个赞
#include <bits/stdc++.h>
using namespace std;
long long n, m, k;
long long sumd(long long x) {
	long long sum = 0;
	while(x) {
		x /= 10;
		sum++;
	}
	return sum;
}
int main() {
	scanf("%lld%lld%lld", &n, &m, &k);
	k -= sumd(n);
	while(k >= 0) {
		if(k - sumd(m) <= 0) {
			break;
		} 
		k -= sumd(m), m += n, n = m - n;
	}
	if(k == 0) {
		cout << n % 10; 
		return 0;
	}
	k = sumd(m) - k;
	while(k) {
		k--, m /= 10;
	}
	cout << m % 10;
	return 0;
}
2 个赞

@zhoukun
!解决方案!
还有,请注意格式化是个好习惯哦

1 个赞