【高精度】乘积根

问题 H: 【高精度】乘积根

时间限制: 1 Sec  内存限制: 64 MB
提交: 11  解决: 4
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

一个整数的数字乘积根是这样得到的:将此整数中的非零数字相乘,得到的结果再重复上述运算,直到只有一位数为止,此一位数即为原整数的数字乘积根。例如:整数99,99--9×9=81--8×1=8,8即为99的乘积根。

 

输入

一个n位的整数(n≤255)。

 

输出

有若干行,每行显示每次数字相乘之后的结果,最后一行只有一个一位数,即n的乘积根。

 

样例输入

99

 

样例输出

81
8

注意!!!!是非零数字相乘!!
 1 #include <iostream>
 2 #include<string>
 3 #include<cstring>
 4 using namespace std;
 5 int n,a[100005],b[100005],c[100005];
 6 string fun_multi(string s,char t)
 7 {
 8     string ans;
 9     if(s=="0"||t=='0')
10     {
11         return "0";
12     }
13     memset(c,0,sizeof(c));
14     int len1=s.size(),w=0,n=t-'0';
15     for(int i=len1-1;i>=0;i--)  a[len1-i-1]=s[i]-'0';
16     for(int i=0;i<len1;i++)
17     {
18         c[i]=a[i]*n+w;
19         w=c[i]/10;
20         c[i]%=10;
21     }
22     if(w)   c[len1]=w,len1++;
23 //    while(!c[len1]) len1--;
24     for(int i=len1-1;i>=0;i--)
25         ans+=c[i]+'0';
26     return ans;
27 }
28 string fun(string s)
29 {
30     string ans="1",t;
31     int len=s.size();
32     for(int i=0;i<len;i++)
33     {
34         if(s[i]=='0')   continue;
35         ans=fun_multi(ans,s[i]);
36 //        if(ans=="0")
37 //            break;
38 //        cout<<ans<<endl;
39     }
40     return ans;
41 }
42 int main()
43 {
44     string s;
45     cin>>s;
46 
47 //    cout<<s<<endl;
48     int len=s.size();
49     if(len==1) {
50         cout<<s<<endl;
51         return 0;
52     }
53     while(len!=1)
54     {
55         s=fun(s);
56         cout<<s<<endl;
57         len=s.size();
58     }
59 //    cout<<s<<endl;
60     return 0;
61 }
View Code

 

posted @ 2018-07-17 14:15  Scott_Wong  阅读(720)  评论(0编辑  收藏  举报