编程要求:
从键盘输入一个不超过6位数字的正整数,求这个数的数字乘积根。
数字乘积的定义:
正整数中的各位非零数字的乘积称为这个数的数字乘积。 例如:1620 的数字乘积是 1×6×2 = 12。
乘积根的定义:
正整数的数字乘积根为反复取该整数的数字乘积,直到最后的数字乘积为一位数字,这个一位数字就称为这个数的数字乘积根。 例如:1620的数字乘积是 1×6×2 = 12 ,对12再取数字乘积是 1×2=2,因此2为1620的数字乘积根。
注:重点在于对整型数的按位分解和递归,这里用到了三种方法将数按位分解,分别是while循环,itoa()函数和ssprintf()函数
代码1:
//用递归解决,这里分解数用while循环
#include <iostream>
using namespace std;
//求乘积根函数
int fun_multi(int n) {
int mul=1,a;
while(n>0){
a=n%10; //取数的个位数
if(a!=0) //判断这个数的个位数是不是0
mul*=a;
n/=10;
}
if(mul<10)
return mul;
// mul小于10,则就是我们要求的乘积根,返回结果
else
fun_multi(mul);
//mul大于9,说明不是最后的结果,递归
}
int main()
{
int n; //要求乘积根的数
cin>>n;
cout<<fun_multi(n)<<endl;
return 0;
}
代码2:
//也是递归,和上面代码不同的是
//将数字按位分解用了itoa函数和强制转换
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
//求乘积根函数
int fun_multi(int n1) {
char a[7];
itoa(n1,a,10); //调用itoa函数,将数字按位分解
int len = strlen(a);//计算数组a[]长度,用于下面的循环
int t,mul=1;
for(int i=0;i<len;++i)
{
t=(int)(a[i]-'0'); //强制将char转换为int类型
if(t!=0) mul*=t;
}
if(mul<10)
return mul; // mul小于10,返回结果
else
fun_multi(mul); //mul大于9,递归
}
int main()
{
int n; //要求乘积根的数
cin>>n;
cout<< fun_multi(n)<<endl;
return 0;
}
代码3:
//这个是用#include<cstdio>头文件中的sprintf()函数
//也可以将整形按位存入字符串数组,效率比itoa()高一点
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int fun_multi(int n1) { //求乘积根函数
char a[7];
sprintf(a,"%d",n1); //将整数n1按位分解存入数组a
int len = strlen(a);
int t,mul=1;
for(int i=0;i<len;++i)
{
t=(int)(a[i]-'0');
if(t!=0) mul*=t;
}
if(mul<10)
return mul; // mul小于10,则就是我们要求的乘积根,返回结果
else
fun_multi(mul); //mul大于9,说明不是最后的结果,递归
}
int main()
{
int n; //要求乘积根的数
cin>>n;
cout<< fun_multi(n)<<endl;
return 0;
}