杭电ACM 1013 Digital Roots

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;
	}
}

确实很简单地说~~欧了,这篇。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值