写在前面:copyer永远打不过coder,希望大家能够独立写出程序,仅仅将我的编码思路作为参考,毕竟还有最后期末考试
题目:
用面向对象方法实现如下功能:
输入一个正整数,求将它每位数相乘得到的乘积不再发生变化需要的步数,也就是乘积等于个位数需要的步数。
举例:
93---->93=27
27----->27=14
14------>1*4=4
所以93需要3步得到个位数的乘积结果。
输入:正整数n
输出:数字n需要的步数为step
参考:
#include <iostream>
#include <cmath>
const int LENGTH_MAX = 20; //所输入最大正整数最长为20位
const int TOSS_MAX = 100; //每位数相乘得到的乘积不再发生变化需要的最大步数为100步
using namespace std;
class machine //这是一个无情的乘法机器,它能够将一个整数分离成单个数字,并计算这些数字连续相乘的的结果
{
public:
int integer; //输入的正整数
int digit[LENGTH_MAX] = { 0 }; //盛放正整数各位的容器组
static int counter; //对类machine的的构造次数进行累加
machine(int inte) { //构造函数,输入整数值,并进行计数
integer = inte;
counter++;
}
~machine(){} //析构函数
int getLength() { //判断正整数长度,已确定实际所需容器组的个数
int length = 1; //这里还有很大优空间,如果将getLength()的值保存给一个变量,
int flash = integer; //就会减少很多的重复计算
for (int i = 0; i < LENGTH_MAX; i++) {
if (flash / 10 >= 1) {
flash = flash / 10;
length++;
}
}
return length;
}
void separator() { //分离器,将所输入的正整数进行分离,同时,将分离后的单个数字放入容器组中
int flash = integer; //所有叫flash的都是一个寄存器,用flash作为名字的原因是因为register被占用了
for (int i = 0; i < getLength(); i++) {
int j = pow(10, getLength()-i-1);
digit[i] = flash % 10;
flash = flash / 10;
}
}
int product() { //累乘器,将容器中被分离的数组相乘
this->separator();
int prdct = 1;
for (int i = 0; i < getLength(); i++) {
prdct *= digit[i];
}
return prdct;
}
};
int machine::counter = 0; //静态变量累加器初始化
int main(void)
{
int flash;
cin >> flash;
for (int i = 0; i < TOSS_MAX; i++) { //这个for循环可以多次构建再结构类machine,并且通过flash实现类machine参数的连续改变
machine mchn(flash);
flash = mchn.product();
if (mchn.product() < 10) break; //每位数相乘得到的乘积不再发生变化后,就打断for循环
}
cout << machine::counter; //输出计数器的值
return 0;
}