CF 122A Lucky Division
Description
Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal representation contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are not.
Petya calls a number almost lucky if it could be evenly divided by some lucky number. Help him find out if the given number n is almost lucky.
Input
The single line contains an integer n (1 ≤ n ≤ 1000) — the number that needs to be checked.
Output
In the only line print "YES" (without the quotes), if number n is almost lucky. Otherwise, print "NO" (without the quotes).
Example
input
47
output
YES
input
16
output
YES
input
78
output
NO
Note
Note that all lucky numbers are almost lucky as any number is evenly divisible by itself.
In the first sample 47 is a lucky number. In the second sample 16 is divisible by 4.
Solution
思路:
法1:
先判断n是不是lucky number,不是就下一步。因为n〈1000,所以再打表将由4和7组成的数存起来。判断n能否被这些数中的任意一个整数。
#include<iostream> #include<algorithm> #include<string> #define ll long long using namespace std; int main(){ ll n,temp; int nums[] ={4,7,44,47,74,77,444,447,474,477,744,747,774,777}; cin>>n; temp = n; while(temp){ if(temp%10 == 7 || temp % 10 == 4){ temp /= 10; } else break; if(temp==0){ cout<<"YES"; return 0; } } for(int i = 0;i<sizeof(nums)/sizeof(int);i++){ if(n%nums[i]==0){ cout<<"YES"; return 0; } } cout<<"NO"; return 0; }
法2:
从4开始遍历直到n,判断当前遍历值是否是n的因子,如果是再判断遍历值是否为lucky number。这种方法囊括了n为lucky number 的情况。
#include<iostream> #include<algorithm> #include<string> #define ll long long using namespace std; = int main() { int n; cin >> n; for (int i = 4; i <= n; i++) { if (n % i == 0) { bool flag = false; string s = to_string(i); for (int j = 0; j < s.length(); j++) { if (s[j] != '4' && s[j] != '7') { flag = true; break; } } if (!flag) { cout << "YES"; return 0; } } } cout << "NO"; return 0; }