[C++]AtCoder Beginner Contest 336 : C Even Digits

原题链接:https://atcoder.jp/contests/abc336/tasks/abc336_c

题解:

  首先本题问的是第几个这种每个位上的都是偶数的数,本质上就是将十进制转化为以0,2,4,6,8作为单位的五进制数。所以本题的思路就是如何将一个十进制数转化为一个五进制数,易得出以下伪代码:

其中的b[i]就是我们存放五进制答案的数组,可以用int b[i]来定义,这里我用的是char b[i],所以在算式上加上了48来表示acsII码中的数字。

while(a>0){
    b[i]=a%5*2+48;
    a=a/5;
    i++;
  }

但是本题值得注意的是a第一个值1对应的是0,如果直接用题目给的a值,那么答案在个位上将产生错误。以下是处理方法:

 a=a-1;

也很简单,只要让a的第一个对应0就行了,最简单的就是a=a-1

但是这是又会产生一个新的问题即a=1时a会处理为0,进入不了while循环,输出不了结果。

我的处理方法是进行单独处理,以下是代码:

if(a==1){
    cout<<0<<endl;
    return 0;
  }

将以上代码整合,以下是完整代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
  int a;
  cin>>a;
  if(a==1){
    cout<<0<<endl;
    return 0;
  }
  a=a-1;
  char b[1000000];
  int i=0;
  while(a>0){
    b[i]=a%5*2+48;
    a=a/5;
    i++;
  }
  for(int j=i-1;j>=0;j--){
    cout<<b[j];
  }
  cout<<endl;
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值