本来以为这道题不是很难,但写起来确实有点费劲,自己写的太过复杂了,这个写的很不错
题目
对于一个正整数n,如果它的各位之和等于它的所有质因数的各位之和,则该数被称为Smith数。例如,31257=3* 3 * 23 * 151,31257 的各位数字之和为3+1+2+5+7=18,它的所有质因数的各位数字之和为3+3+2+3+1+5+1=18,因此,31257是一个Smith数。编写一个程序判断输入的正整数是不是Smith数。
输入说明:有多组数据,每组数据只有一个整数n(<100000,占一行),为0时表示输入结束。
输出说明:对于每一组数据,输出一个yes或no(表示该数是否为Smith数)。
输入样本:
31257
123
0
输出样本:
yes
no
思路
需要编写的两大内容:
- 计算一个数的各个位的数字之和
int sum(int n)//各位数字求和
{
int sum;
for(sum=0;n;n/=10)//n不断的除以10,从而去获取每一位数的值
sum+=n%10;//记得%,去获取个位数的值
return sum;
}
- 计算质因数,且求出质因数的各位之和
for(i=2;i<n;)
{
if (n%i==0)
{
t=t+sum(i); //将质因数各位进行拆分求和
/*将n继续除以质因数可以得到余下质因数的乘积,之后继续用该
质因数去除以n,可以看该质因数是否为n的重复的质因数
*/
n=n/i;
}
else i++;
}
t2=t+sum(n);//这里的n为最后一个质因子,因为i在最后一次的循环,无法将n整除,所以会留下一个质因子
程序
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int sum(int n)//各位数字求和
{
int sum;
for(sum=0;n;n/=10)//n不断的除以10,从而去获取每一位数的值
sum+=n%10;//记得%,去获取个位数的值
return sum;
}
int main()
{
vector<string> s;
int n,i;
int t1,t2,t=0;
cin>>n;
while(n) //判断输入的元素是否为0,若为0则结束该循环
{
int j=n;
t1=sum(n); //获取该元素的各位数之和
for(i=2;i<n;)
{
if (n%i==0)
{
t=t+sum(i); //将质因数各位进行拆分求和
/*将n继续除以质因数可以得到余下质因数的乘积,之后继续用该
质因数去除以n,可以看该质因数是否为n的重复的质因数
*/
n=n/i;
}
else i++;
}
t2=t+sum(n);//这里的n为最后一个质因子,因为i在最后一次的循环,无法将n整除,所以会留下一个质因子
if(t1==t2&&n<j)//这里判断质因子各元素之和是否与n的各元素之和相等,且去判断n是否有质因子
//(若没有质因子)则这里的n会==j,因为他没有经过判断
s.push_back("yes");//用栈输入输出
else
s.push_back("no");
t=0;
cin>>n;
}
for(int k=0;k<s.size();k++)
cout<<s[k]<<endl;
return 0;
}