题目大意:
Niven数是指一个数各位相加的值可以整除该数(十进制下)本身,先给定任意数制b进制(2 ≤ b ≤ 10),求它是否是Niven数,是输出yes否则输出no。
现有多个测例(测例数不确定),每个测例都会输入若干行,每行有b和该数的字符序列,对于每一行输入都输出yes或者no,一个测例以b = 0结束。
注释代码:
/*
* Problem ID : ZOJ 1154 Niven Numbers
* Author : Lirx.t.Una
* Language : C
* Run Time : 0 ms
* Run Memory : 168 KB
*/
#include <string.h>
#include <stdio.h>
//测试过的最长位数
#define MAXN 10
char di[MAXN];//digit,保存一个数的每一位
int
main() {
int t;//测例数
int b;//base,进制
int n;//一个数的位数
int bit;//存放当前字节
int sbt;//sum of all bit,每一位之和
int dec;//decimal,表示一个数的十进制
int i;
scanf("%d", &t);
while ( t-- ) {
while ( scanf("%d", &b), b ) {
scanf("%s", di);
n = strlen(di);
sbt = 0;
dec = 0;
for ( i = 0; i < n; i++ ) {
bit = di[i] - '0';
sbt += bit;
dec = dec * b + bit;//进位转换,累加
}
if ( dec % sbt )
puts("no");
else
puts("yes");
}
if (t) putchar('\n');//测例间有空行,最后一个测例后无空行
}
return 0;
}
无注释代码:
#include <string.h>
#include <stdio.h>
#define MAXN 10
char di[MAXN];
int
main() {
int t;
int b;
int n;
int bit;
int sbt;
int dec;
int i;
scanf("%d", &t);
while ( t-- ) {
while ( scanf("%d", &b), b ) {
scanf("%s", di);
n = strlen(di);
sbt = 0;
dec = 0;
for ( i = 0; i < n; i++ ) {
bit = di[i] - '0';
sbt += bit;
dec = dec * b + bit;
}
if ( dec % sbt )
puts("no");
else
puts("yes");
}
if (t) putchar('\n');
}
return 0;
}