题目大意:求给出数每位数字之和,如果大于9,则继续求和直到只有一位数为止。
解题思路:直接利用字符串存下来,对每一位相加,当大于9的时候,再对该值进行一次加,直到为一位数为止。后边在学习九余数定理时,发现任何数经过弃九后与这样直接模拟的结果一致,可以简单证明下。因此将其转化为九余数问题变得更加简单巧妙,详见code。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1013
模拟 code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 1000+10;
char num[MAXN];
int n,ans;
int main(){
while(scanf("%s",num)!=EOF){
int len=strlen(num);
if(len==1 && num[0]=='0') break;
ans=0;
for(int i=0;i<len;i++){
ans+=num[i]-'0';
if(ans>9){
ans=ans%10+ans/10;
}
}
printf("%d\n",ans);
}
return 0;
}
九余数 code:
#include <cstdio>
#include <iostream>
using namespace std;
int i,ans,n;
int main(){
while(scanf("%d",&n)&&n){
ans=1;
for(i=0;i<n;i++){
ans=ans*n;
ans=ans%9==0?9:ans%9;
}
printf("%d\n",ans);
}
return 0;
}