ZOJ 3449 Doraemon's Number Game III 题目链接
组队赛的一个题,只能说自己太菜,完全不知道有数根这个东西。。。
题意: 把一个十进制的数,写成按b进制形式的十进制数,一直下去,直到在[0,10)之间。
数根: 点击打开链接
from Baidu
数根 最后得出这样一个公式: digital root = 1 + ((num - 1) % 9)
那么这个题其实是数根的扩展版:
数根:把一个数转化为 1 进制 然后继续进一步的转化,知道小于10。
对于这个公式的理解,其实根据看上面的那个链接就行,即
那么(num-1) 的目的就是为了避免 n=9 的情况,比如 某一个数 n=9
(9-1)%9+1=9
对于这个题: 我们是转化为b 进制,那么 公式应该变为: (n - 10) % (10 - b) + b;
解释一下为什么是(n-10) 由于并不是针对某一个数而进行变换,即要得出一个通解,n- 10 可以避免只剩下一位的时候出现的问题,其实 1 进制的时候 也可以改为 (n-10)%9+1 .(解释有些牵强)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10;
char s[N],len;
int solve(int k)
{
if(len==1)
return s[0]-'0';
int ans=0;
for(int i=0;s[i]!='\0';i++)
{
ans=ans*10+s[i]-'0';
ans%=(10-k);
}
ans=((ans-10)%(10-k)+10-k)%(10-k);
return ans+k;
}
int main()
{
while(gets(s))
{
len=strlen(s);
for(int i=1;i<=9;i++)
{
if(i==1)
printf("%d",solve(i));
else
printf(" %d",solve(i));
}
printf("\n");
}
return 0;
}