题目描述:
大家都知道约瑟夫环吧?现在这里有 n 个数围成的环,从第一个人开始喊 1 每个喊到 n−1的人要出去,下一个人要从 1开始喊。
现在我想知道第一个出去的人的编号是多少。
输入格式:
第一行一个数 n 表示有n个人 (1<=n<=1e100)
输出格式:
一个数,表示最先出去的人的编号
输入样例:
在这里给出一组输入。例如:
5
输出样例:
在这里给出相应的输出。例如:
4
思路描述:
这道题很简单,就是输入n-1就行了,但是它的n最大为1e100,就算是用unsigned long long都存不下这么大的数,因此我们需要用数组来存放n的值,这里有个问题需要注意,就是当我们减去1以后,如果这个数变成小于0的数了,那么我们需要通过上一位减1下一位加10的方法,让它大于10。
代码展示如下:
#include <bits/stdc++.h>
using namespace std;
int num[100];
int main(){
string s;
cin >> s;
if(s.size()==1&&s[0]=='1'){
cout << "1";
return 0;
}
int i;
for(i=0;i<s.size();i++)num[i]=s[i]-'0';
num[s.size()-1]--;
for(i=s.size()-1;i>=1;i--){
if(num[i]<0){
num[i]+=10;
num[i-1]-=1;
}
}
int judge=0;
for(i=0;i<s.size();i++){
if(num[i]!=0&&judge==0){
cout << num[i];
judge=1;
}
else if(judge!=0)cout << num[i];
}
return 0;
}