链接:https://www.nowcoder.com/questionTerminal/34f17d5f2a8240bea661a23ec095a062?toCommentId=47888
来源:牛客网
星际战争开展了100年之后,NowCoder终于破译了外星人的密码!他们的密码是一串整数,通过一张表里的信息映射成最终4位密码。表的规则是:n对应的值是矩阵X的n次方的左上角,如果这个数不足4位则用0填充,如果大于4位的则只输出最后4位。
|1 1|^n => |Xn ..|
|1 0| |.. ..|
例如n=2时,
|1 1|^2 => |1 1| * |1 1| => |2 1|
|1 0| |1 0| |1 0| |1 1|
即2对应的数是“0002”。
输入描述:
输入有多组数据。 每组数据两行:第一行包含一个整数n (1≤n≤100);第二行包含n个正整数Xi (1≤Xi≤10000)
输出描述:
对应每一组输入,输出一行相应的密码。
示例1
输入
6 18 15 21 13 25 27 5 1 10 100 1000 10000
输出
418109877711037713937811 00010089410135017501
思路:
正整数: 1 2 3 4 5....
X的n次方的左上角的数: 1 2 3 5 8....
这是一个斐波那契数列。
所以重点就在于将不足1000的数字,写成四位数。
我们可以用 to_string 将数字转化成字符串 相应位置补0就可以了。
代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int x;
while (cin >> x)
{
vector<int> arr;
for (int i = 0; i < x; i++)
{
int y = 0;
cin >> y;
arr.push_back(y);
}
vector<int> arr1(100001, 0);
arr1[0] = 0;
arr1[2] = 2;
arr1[1] = 1;
for (int i = 3; i < 100001; i++)
{
arr1[i] = (arr1[i - 1]) % 10000 + (arr1[i - 2]) % 10000;
if (arr1[i] >= 10000)
arr1[i] %= 10000;
}
string ret;
for (int i = 0; i < x; i++)
{
int a = arr1[arr[i]];
string b;
if (a < 1000)
{
string as = to_string(a);
for (int j = 0; j < 4 - as.size(); j++)
{
b += "0";
}
b += as;
}
else
b = to_string(a);
ret += b;
}
cout << ret << endl;
}
return 0;
}