题目描述
正整数中的各位非零数字的乘积称为该数的数字乘积。
如1620的数字乘积为162=12,12的数字乘积为1*2=2。
正整数的数字乘积根为反复取该整数的数字乘积,直到最后的数字乘积为一位数字,这个一位数字就叫该正整数的数字乘积根。
例如1620的数字乘积根为2。编程求不超过200位数字的正整数的数字乘积根。
输入格式
输入有若干行,每行一个正整数n。(1<=n<10^200)
输出格式
输出n的数字乘积根。
输入样例
1620
123456
输出样例
2
4
分类标签
基础题 高精度乘
C/C++代码
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
vector<int> work;
vector<int> process( int n )//高精度乘
{
int t = 0;
vector<int> vc;
for( int i=0;i<work.size();i++ )
{
vc.push_back( (t + (work[i]*n))%10 );
t = (t + (work[i]*n))/10;
}
if( t )
vc.push_back( t );
work = vc;
return work;
}
int main()
{
string s;
while( cin>>s )
{
vector<int> ve,tem;
for( int i=0;i<s.size();i++ )//char -> int
if( s[i]>='1' && s[i]<='9' )
ve.push_back( (s[i]-'0') );
while( ve.size()>1 )//直至ve.size()==1 如:123456->720->14->4 输出4
{
work.clear();
work.push_back(1);
for( int i=0;i<ve.size() ;i++ )//123456->720->14->4 共计三步(三次for)
{
/*
第一次,123456->720
第二次,720->14
第三次,14->4 退出while循环 输出ve[0]即4。
*/
if( ve[i]!=0 )
tem = process(ve[i]);
else continue;
}
ve = tem;
}
cout<<ve[0]<<endl;
ve.clear();
}
return 0;
}