【听说有人想转码】入门----超大数据的加法(约瑟夫环)“谁是最快出去的呢?”用string代替int

上题目

谁是最快出去的呢? (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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值