7-7 尼文数
如果一个数的各位数字之和能整除它本身,这样的数叫尼文数(Niven)。如111是尼文数,因为它的各位数字之和是3,能够整除111。同样,对于其他进制下,也存在尼文数。如二进制下110是一个尼文数,因为二进制数110的各位数字之和是2,能够整除它的值6。现在请你判断一下b进制数n是不是一个尼文数。其中2<=b<=10。
输入格式:
有多组测试数据。每组测试数据包含一行中用空格分隔的两个数b和n,b=0时结束输入。
输出格式:
如果这组测试数据中的n是尼文数,在一行上输出"yes",否则输出"no"
输入样例:
10 111
2 110
10 123
6 1000
8 2314
0
输出样例:
yes
yes
no
yes
no
解题思路:
本题要求给定进制的数的每一位的和能整除该数十进制的值,我么也就能将本题分成:将输入的给定进制数的每一位相加求和 -> 将输入的数字转换为十进制数 -> 将转换完的十进制数对每一数位相加后的和进行取余 -> 若得0,则输出yes,否则输出no
每位相加求和函数
int every_place_sum(int n)
{
int place[100] = { 0 };
int place_count = 0, place_sum = 0;
while (n != 0)
{
place[place_count] = n % 10;
n /= 10;
place_count++;
}
for (int i = 0; i < place_count; i++)
{
place_sum += place[i];
}
return place_sum;
}
转换到十进制函数
int to_decimal(int num, int radix)
{
int place[100] = { 0 };
int place_count = 0, decimal_num = 0;
while (num != 0)
{
place[place_count] = num % 10;
num /= 10;
place_count++;
}
for (int i=0;i<place_count;i++)
{
decimal_num += place[i] * pow( radix , i);
}
return decimal_num;
}
判断函数
bool judge(int num, int radix)
{
if ((to_decimal(num, radix) % every_place_sum(num)) == 0)
{
return true;
}
else
{
return false;
}
}
参考代码:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int every_place_sum(int n)
{
int place[100] = { 0 };
int place_count = 0, place_sum = 0;
while (n != 0)
{
place[place_count] = n % 10;
n /= 10;
place_count++;
}
for (int i = 0; i < place_count; i++)
{
place_sum += place[i];
}
return place_sum;
}
int to_decimal(int num, int radix)
{
int place[100] = { 0 };
int place_count = 0, decimal_num = 0;
while (num != 0)
{
place[place_count] = num % 10;
num /= 10;
place_count++;
}
for (int i=0;i<place_count;i++)
{
decimal_num += place[i] * pow( radix , i);
}
return decimal_num;
}
bool judge(int num, int radix)
{
if ((to_decimal(num, radix) % every_place_sum(num)) == 0)
{
return true;
}
else
{
return false;
}
}
void excute()
{
int judge_sign[100][1] = { 0 };
int group[100] = { 0 };
int num, radix, group_count = 0;
while (cin >> radix)
{
if (radix==0)
{
break;
}
cin >> num;
if (judge(num, radix))
{
judge_sign[group_count][0] = 1;
}
else
{
judge_sign[group_count][0] = 0;
}
group_count++;
}
for (int i = 0; i < group_count; i++)
{
if (judge_sign[i][0] == 1)
{
cout << "yes" << endl;;
}
else
{
cout << "no" << endl;
}
}
}
int main()
{
excute();
return 0;
}
欢迎交流学习
原创不易,看官点个关注再走~~~