2021.04.02-正整数各位数相乘得到的乘积不再发生变化需要的步数

本文介绍如何使用面向对象的方法实现一个程序,输入一个正整数,计算将其每位数相乘直至结果不变所需的步数。通过实例93的分解和累乘过程,演示了如何构造`machine`类来完成任务,最终输出步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:copyer永远打不过coder,希望大家能够独立写出程序,仅仅将我的编码思路作为参考,毕竟还有最后期末考试
题目:

用面向对象方法实现如下功能:

输入一个正整数,求将它每位数相乘得到的乘积不再发生变化需要的步数,也就是乘积等于个位数需要的步数。
举例:
93---->93=27
27----->2
7=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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huber Wong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值