• 算法设计与分析 1.3 杰哥和数字


    题目描述

    有一个正整数X,想知道有多少个满足要求的正整数D存在,要求是D是X的因子,并且D和X至少有一位相同。

    输入格式

    只有一行,一个正整数X。

    
    

    对于30%的数据,X<=100。

    
    

    对于50%的数据,X<=200。

    
    

    对于100%的数据,X<=1000000000。

    输出格式

    只有一行,一个整数表示满足要求的数字D的个数。

    样例输入

    10
    

    样例输出

     2


    方法一:

    顺着题目思路,分两步,第一步先求所有因子,第二步和X进行比较。

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <iostream>
    using namespace std;
    #define MAX 15
    int x, n = 0;
    int a[MAX], b[MAX]; //x拆完后存储于a,找到的因子拆完后存储于b
    int split(int num, int N[]);
     
    int isSameFigure(int xx, int ii) //判断X和它的因子是否存在相同的数字
    {
        int w1, w2; // 用来存位数
        int flag = 0;
        memset(b, 0, sizeof(b));
        w1 = split(xx, a);
        w2 = split(ii, b);
        for (int i = 1; i <= w1; i++)
        {
            for (int j = 1; j <= w2; j++)
            {
                if (a[i] == b[j])
                {
                    flag = 1;
                    break;
                }
            }
            if (flag == 1) break;
        }
        return flag;
    }
    
    int split(int num, int N[]) // 拆数字用,每位数字是以倒序存储在数组里,从a[1]开始
    {
        int numx, i = 0;
        numx = num;
        while (numx)
        {
            N[++i] = numx % 10;
            numx = numx / 10;
        }
        return i; // 返回的是待拆数字的位数
    }
    
    int main()
    {
        cin >> x;
        for (int i = 1; i * i <= x; i++)
        {
            if (x % i == 0)
            {
                if (i * i == x) // 若为平方根,则判断是否有相同数字的操作只做一次,若不为平方根,则计算两次
                {
                    n += isSameFigure(x, i);
                }
                else
                {
                    n += isSameFigure(x, i);
                    n += isSameFigure(x, x / i);
                }
            }
        }
        cout << n;
    

    方法二:

    前一步求所有因子是没法省略的,所有在第二步比较的时候优化了算法,思想是把所有出现的数字用数组存起来,如果比对再次出现那个数字,则满足条件跳出了循环。

    #include<iostream>
    #include<cstring>
    using namespace std;
    int compare(int i);
    int a[9] = { 0 };
    
    int main()
    {
        int n = 0;//输入的数字
        cin >> n;
        int x = 0, i = n;//标志位
        int count = 0;//总数计数
        while (i != 0)
        {
            x = i % 10;
            i = i / 10;
            a[x] = 1;
        }
    
        for (i = 1; i * i <= n; i++)
        {
            if (n % i == 0)
            {
                if (i * i == n)
                {
                    if (compare(i)) count++;
    
                }
                else
                {
                    if (compare(i)) count++;
                    if (compare(n / i)) count++;
                }
            }
        }
        cout << count;
    }
    
    int compare(int i)
    {
        int x;
        while (i != 0)
        {
            x = i % 10;
            if (a[x] == 1) return 1;
            else i = i / 10;
        }
        return 0;
    }
    
  • 相关阅读:
    商品销量与虚拟销量的计算方法
    EF获取当天的数据集合
    C# xml转化为类集合
    Linux下找不到动态链接库;
    STRTOK函数和STRTOK_R函数
    Ubuntu Linux 环境变量PATH设置
    关于Ubantu下使用cshell的问题解决
    realloc 使用详解(分析realloc invalid pointer、指针无效等错误)【转】
    ubuntu安装包查找及安装
    【转】MySql数据库--mysql_real_escape_string()函数
  • 原文地址:https://www.cnblogs.com/chelinger/p/11586818.html
Copyright © 2020-2023  润新知