上题目
谁是最快出去的呢? (4 分)
大家都知道约瑟夫环吧?现在这里有 n 个数围成的环,从第一个人开始喊 1 每个喊到 n−1的人要出去,下一个人要从 1开始喊。
现在我想知道第一个出去的人的编号是多少。
输入格式:
第一行一个数 n 表示有n个人 (1<=n<=1e100)
输出格式:
一个数,表示最先出去的人的编号
输入样例:
在这里给出一组输入。例如:
5
输出样例:
在这里给出相应的输出。例如:
4
唠嗑
乍一看很简单,以为考的是输入n输出n-1。但仔细想一下,发现如果我写的是int n;cin>>n;在面对99999999999999时这个n是会出错的。
1. 还是那样,它都不是个好好的守规矩的数了,我们就不把它当作数,这次我把它当作string .
之前有发过类似的题目。【听说有人想转码】科学计数法----如何处理超大数据、让数字变字符、小数点的移位_m0_64016875的博客-CSDN博客
2.从同学那学来了size()。如果a为string变量,则a.size()就知道a的大小。a为xcd则返回3,a为2345则返回4.
3.如何从string转成int数组?假设s是string型,a[n]是int型数组,那么用a[i]=s[i]-'0' 就能实现。因为在string中0123456789都是字符,它们的ASCII码是依次排列的。字符‘2’与‘0’在ASCII码上的距离就是2这个数字。
4.同理s[i]-'1'就相当于减1.
5.当然咯,也要考虑个位数是0的情况,还有100-1=99这种糟心玩意儿要怎么处理。可以联想小学数学加减法两式相减。
上代码
#include <iostream>
using namespace std;
int main()
{
string s;
cin>>s;
int num=s.size(),i,a[1000];
if(s.size()==1&&s[0]==1)cout<<1;
else if(s[num-1]!='0')
{
for(i=0;i<(s.size()-1);i++)
{
cout<<s[i];
}
cout<<s[i]-'1';
}
else
{
for(i=num-1;i>=0;i--){a[i]=s[i]-'0' ;}
int y=1;
a[num-1]=9;
for(i=num-2;i>=0;i--)
{
if(y==1&&a[i]==0)
{
a[i]=9;
y=1;
}
else if(y==1&&a[i]!=0)
{
y=0;
a[i]-=1;
}
else if(y==0)
{
y=0;
}
}
if(a[0]==0)
{
for(i=1;i<num;i++)cout<<a[i];
}
else
{
for(i=0;i<num;i++)cout<<a[i];
}
}
return 0;
}