C++ 1107: 乘积根

题目描述

正整数中的各位非零数字的乘积称为该数的数字乘积。
如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;
}

猜你喜欢

转载自blog.csdn.net/weixin_47700137/article/details/129390614
今日推荐