刚开始想复杂了,掉进坑里了,而且还用了 <sstream>这个库来用stream的方法将int类型转化为string类型,但是我总算明白了为什么当年书上叫我们慎用stream了,这速度真是慢的感人,直接让我TLE了
这个方法应该是可行的,就是时间方面不允许,这种方法的代码如下:
#include <cstdio>
#include <iostream>
#include <sstream>
using namespace std;
std::stringstream stream;
int sum(string a)
{
int res=0;
for(int i=0;a[i]!=0;i++)
res+=a[i]-'0';
while(res>=10){
stream<<res;
a=stream.str();
res=0;
for(int i=0;a[i]!=0;i++)
res+=a[i]-'0';
}
return res;
}
int main()
{
string digit;
cin>>digit;
while(digit[0]!='0'){
int result=sum(digit);
printf("%d\n",result);
cin>>digit;
}
return 0;
}
于是就换方法
后来还是想的有点复杂,还把每位加起来大于等于10的情况又当成初始情况用字符数组来存,后来发现没这个必要,就算刚开始给的数字很大,它的所有位的和用int来存也就足够了,于是就第一步用字符数组处理,后面的就在while里对int不断每位相加判断和是否大于等于10即可
AC代码如下:
#include <cstdio>
#include <iostream>
using namespace std;
int sum(char * a);
int main()
{
char a[1000];
scanf("%s",a);
while(a[0]!='0'){
int result=sum(a);
printf("%d\n",result);
scanf("%s",a);
}
return 0;
}
int sum(char * a)
{
int res=0;
for(int i=0;a[i]!=0;i++)
res+=a[i]-'0';
while(res>=10){
int temp=res;
/* int digit_num=0;
while(temp>0){
temp/=10;
digit_num++;
}
a[digit_num]=0;
for(int i=digit_num-1;i>=0;i--){
a[i]=res%10;
res/=10;
}
for(int i=0;a[i]!=0;i++)
res+=a[i]-'0';
*/
res=0;
while(temp>0){
res+=temp%10;
temp/=10;
}
}
return res;
}