列表

详情


CMB18. X游戏

描述

我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。

如果一个数的每位数字被旋转以后仍然还是一个数字, 则这个数是有效的。0, 1, 和 8 被旋转后仍然是它们自己;2 和 5 可以互相旋转成对方;6 和 9 同理,除了这些以外其他的数字旋转以后都不再是有效的数字。

现在我们有一个正整数 N, 计算从 1 到 N 中有多少个数 X 是好数?

输入描述

输入正整数N

输出描述

输出1到N中好数个数

示例1

输入:

10

输出:

4

说明:

在[1, 10]中有四个好数: 2, 5, 6, 9。
注意 1 和 10 不是好数, 因为他们在旋转之后不变。

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2019-08-27

#include<stdio.h>

int main()
{
    int n;
    scanf("%d",&n);
    int a[1000];
    int counter = 0;
    int i = 0;
    for(i = 1; i <= n; i++)
    {
        int flag = 0;
        int sign = 1;
        int j = i;
        int m =0;
        while(j)
        {
            a[m]=j%10;
            
            
            if(a[m] == 3 ||a[m] == 4 || a[m] == 7)
            {
                sign = 0;
                 break;
            } 
            j /= 10;
            m++;
        }
        
        if(sign == 1)
        {
            int k;
            for( k = 0; k < m; k++)
            {
                if(a[k] == 2 || a[k] == 5 || a[k] == 6 || a[k] == 9)
                {
                    flag = 1;
                    break;
                }
                
            }
            if(flag == 1)
                counter++;
        }
       
    }
    printf("%d\n",counter);
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2020-11-27

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
bool check(int x)
{
    bool flag=false;
    int temp;
    while(x>0)
    {
        temp=x%10;
        if(temp==3||temp==4||temp==7)
            return false;
        else if(temp==2||temp==5||temp==6||temp==9)
            flag=true;
        x/=10;
    }
    return flag;
}
int main(void)
{
    int n,i,sum=0;
    scanf("%d",&n);
    for(int i=0;i<n+1;i++)
    {
        sum+=check(i);
    }
    printf("%d",sum);
    return 0;
}

上一题