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);
sprintf
语法: #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;
}
问题又来了,我在cfree上通过的,而且答案很对,格式没问题,又是wrong answer,我已经囧了。无奈,我baidu了一下,发现他居然不让用int~~八嘎,你题目中有没说是大数,好吧,咱重来。
#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;
}
}
确实很简单地说~~欧了,这篇。