题目
谁是最快出去的呢?
大家都知道约瑟夫环吧?现在这里有 n 个数围成的环,从第一个人开始喊 1 每个喊到 n−1的人要出去,下一个人要从 1开始喊。
现在我想知道第一个出去的人的编号是多少。
输入格式:
第一行一个数 n 表示有n个人 (1<=n<=1e100)
输出格式:
一个数,表示最先出去的人的编号
输入样例:
5
输出样例:
4
题目分析
说人话:就是输入大于1的数,输出该数-1 ,耐人寻味之处在于超大的上界,longlong也存储不了,所以理所当然想到用字符串存储啦~
ASCII码减1的方法应该很多,我想到的是+‘0’-‘1’,同理任意两个表中相邻的一加一减即可。
PS 一些小细节
1,输入1要单独考虑
2,末尾为0考虑借位
3,若数字位数减少,要考虑不输出前导的0(例:100输出99而非099)
参考答案
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s;
cin >> s;
int n = s.size();
int i = 1;
if (n == 1 && s[0] == '1')
cout << '1';
else
{
if (s[n - 1] != '0')
s[n - 1] = s[n - 1] + '0' - '1';
else
{
while (s[n - i] == '0')
{
s[n - i] = '9';
i++;
}
s[n - i] = s[n - i] + '0' - '1';
}
int j = 0;
while (s[j] == '0')
{
j++;
}
for(int k=j;k<n;k++)
cout << s[k];
}
return 0;
}