题目描述:
有一个正整数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;
}
网友评论