http://acm.hdu.edu.cn/showproblem.php?pid=1013
这道题是求一个正数的根(digital root),各个位数不断相加知道取得个数。
首先,我想到的是把int型的数变成char数组。用itoa()函数。
#include<iostream> #include<stdlib.h> using namespace std; int main(){ int n,sum=0; char str[100]; while(cin>>n){ if(n==0) return 0; do{ sum=0; itoa(n,str,10); //错误,编译器不认识 int len=strlen(str); for(int i=0;i<len;++i) sum+=str[i]-48; if(sum<10) cout<<sum<<endl; n=sum; }while(sum>9); sum=0; } }
但是杭电的ACM complier不接受itoa函数,原因是itoa是c++的扩展函数,当然不能指望任何编译器都可以编译了~~
注:
课件内容:
itoa不是ansi函数, 能将整数转换为字符串而且与ANSI标准兼容的方法是使用sprintf()函数
int num = 100;
char str[25];
sprintf(str, " %d" , num);
#include <stdio.h> int sprintf( char *buffer, const char *format, ... ); |
so,我换了一种好笨的方法,用除法和余数,一个个把int转换成char。
#include<iostream> using namespace std; int main(){ int n,sum=0; while(cin>>n){ //错误,不可以用int型,大数的话溢出了怎么办。 if(n==0) return 0; do{ sum=0; while(n){ sum+=n%10; n=n/10; } n=sum; }while(sum>9); cout<<sum<<endl; sum=0; } return 0; }
#include<iostream> using namespace std; int main(){ int n=0,i,sum=0; char s[1000]; //据说这里小了也不行 while(cin>>s){ sum=0; n=0; if(strcmp(s,"0")==0) break; int len=strlen(s); for(i=0;i<len;i++) n=n+s[i]-48; //接下来就是对int型的数 n求 root了 do{ sum=0; while(n){ sum+=n%10; n=n/10; } n=sum; }while(sum>9); cout<<sum<<endl; } }
后来看了看discuss,发现一个小牛的一句话“这不就是求9的模吗?”~~瞬间石化,尼玛,还有这招~~so~~试试
#include<iostream> using namespace std; int main(){ int n=0,i; char s[1000]; while(cin>>s){ if(strcmp(s,"0")==0) break; int len=strlen(s); for(i=0;i<len;i++) n=n+s[i]-48; while(n>9) n=n%9; if(n==0) cout<<9<<endl; else cout<<n<<endl; n=0; } }