hdu1013 Digital Roots
The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the process is repeated. This is continued as long as necessary to obtain a single digit.
首先是string模拟做法 需要注意用到的to_string函数有些编译器可能不支持,但是hdu可以使用
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int main()
{
//freopen("datain.txt", "r", stdin);
string n;
int t;
while (cin >> n) {
if (n == "0")break;
while (n.length() > 1) {
t = 0;
for (int i = 0;i < n.length();i++) {
t += n[i] - '0';
}
n = to_string(t);
}
cout << n << endl;
}
}
char模拟,大同小异
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
//freopen("datain.txt","r",stdin);
char num[1000];
while(~scanf("%s",num)){
if(!strcmp(num,"0"))break; //strcmp相同返回0
int len=strlen(num); int digit=0;
for(int i=0;i<len;i++){
digit+=num[i]-'0';
}
while(digit>9){
int tmp=0;
while(digit>0){
tmp+=digit%10;
digit/=10;
}
digit=tmp;
}
printf("%d\n",digit);
}
}
下面介绍一下九余数定理
(a+b)%p = (a%p+b%p)%p;
(a-b)%p = (a%p-b%p)%p;
(a*b)%p = (a%p*b%p)%p;
(a^b)%p = ((a%p)^b)%p;
1234%9=(1%9*1000%9+2%9*100%9+3%9*10%9+4%9)%9=(1+2+3+4)%9;
出现这种状况的原因的是10的倍数对9取余为1,例如1000=9*111+1 , 100=9*11+1 , 10=9*1+1;
总结:一个整数模9的结果与这个整数的各位数字之和模9的结果相同
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
//freopen("datain.txt","r",stdin);
char num[1000];
while(~scanf("%s",num)){
if(!strcmp(num,"0"))break; //strcmp相同返回0
int len=strlen(num);int sum=0;
for(int i=0;i<len;i++){
sum+=num[i]-'0';
}
int ans=(sum-1)%9+1;//只写sum%9,会让本该是9的结果变为0
printf("%d\n",ans);
}
}
hdu1163 求n^n的digital roots
在快速幂的过程中不断使用九余数定理即可
快速幂实现 以下:
int poww(int a,int b){
int ans=1,base=a;
while(b){
if(b&1)
ans*=base;
base*=base;
b>>=1;
}
return ans;
}
#include<cstdio>
#include<cstring>
using namespace std;
int qp(int a,int b, int c=9){
int ans=1,base=(a-1)%c+1;
while(b){
if(b&1)ans*=base,ans=(ans-1)%c+1;
base=(base*base-1)%c+1;
b>>=1;
}
return ans;
}
int main()
{
//freopen("datain.txt","r",stdin);
int n;
while(~scanf("%d",&n)){
if(!n)break;
printf("%d\n",qp(n,n));
}
}