auj 611 消失的5,8,9

http://icpc.ahu.edu.cn/OJ/Problem.aspx?id=611

题目描述

期末成绩出来了,又是58,59,无奈啊,yobobobo无法接受这个现实,于是暗下决定:从此之后,5,8,9这些数字将在我的字典里消失!现在yobobobo的世界里没有5,8,9,所以他世界里的数值和我们不一样,在他的世界里,4之后就到了6(我们当然是5),所以yobobobo的世界是这样的:

1,2,3,4,6,7,10,11,12,13,14,16,,17……..47,60……,现在给你一个yobobobo世界里的数值N,请输出他原来的数值(比如6,其实它本来是5)。

输入包括多组数据,以文件(EOF)结束。
每组测试数据一个整数N(0<=N<=10^9)(输入保证每位数值绝对不包含5,8,9中的任何一位)

每组数据输出一个整数,表示真实的N

Sample Input

0

6

221712

Sample Output

0

5

39062

方法与总结

  • 此题就是个进制转换问题,yobobobo的世界没有5,8,9,意思也就是他用的是七进制进制,只不过是用十进制的6代表七进制的5,用十进制的7代表七进制的6,所以在进制转换是遇见6和7就应该减1后再继续运算。
  • 转换进制时我又用了math.h中的pow函数,由于pow函数接受和返回的数值均为浮点型,在计算和比较时可能会带来误差,结果就WA了,平时在整数运算是尽量不要用pow函数,自己写一个

代码

#include<iostream>
using namespace std;

int pow7(int n)求7的n次方
{
    int pk=1;
    for(int i=1;i<=n;i++)
        pk*=7;
    return pk;
}

int main()
{
    int n;
    while(cin>>n)
    {
        int num,sum;
        int k=0;
        sum=0;
        while(n>0)//进制转换
        {
            num=n%10;
            if(num>5 && num<8)//6,7应该进行减1
                num--;
            sum+=num*pow7(k++);
            n/=10;
        }
        cout<<sum<<endl;
    }
    return 0;
 } 
/* bottom:40px 距浏览器底部距离 right:40px 距浏览器右边距离 */