求数字的乘积根c++,难题求大神解决(嘉泽题,编号1548)
问题 O: 【基础】求数字的乘积根时间限制: 1.000 Sec 内存限制: 64 MB提交: 599 解决: 206[提交] [状态] [报告] [命题人:][下载数据: ?]题目描述正整数的数字乘积这样规定:这个正整数中非零数字的乘积。例如整数999的数字乘积为9*9*9,得到729;729的数字乘积为7*2*9,得到126;126的数字乘积为1*2*6,得到12;12从数字乘积为1*2,得到2。如此反复取数字的乘积,直至得到一位数字为止。999的数字乘积根是2。编程输入一个长度不超过100位数字的正整数,输出计算数字乘积根的每一步结果。输入一行,一个不超过100位的正整数。输出若干行,每一行为一个计算的结果。样例输入 3486784401输出 3486784401
516096
1620
12
2
这个是基础的问题,完整参考(没有考虑效率)
#include <cstring> #include <iostream> using namespace std; int f(int a[], int b[], int n) { int add[100] = { 0 }, i, j, top = 1; b[0] = 1; for(i = 1; i < 100; i++) b[i] = 0; for(i = 0; i < n; i++) { if(a[i]) { int m = top; for(j = 0; j < m; j++) { int tmp = b[j] * a[i]; if(j == 0) { b[0] = tmp % 10; add[0] = tmp / 10; } else { b[j] = (tmp + add[j - 1]) % 10; add[j] = (tmp + add[j - 1]) / 10; } while(add[top - 1] > 0) { top++; int tmp = b[top - 1]; b[top - 1] = (tmp + add[top - 2]) % 10; add[top - 1] = (tmp + add[top - 2]) / 10; } } } } return top; } int main() { int i, n, a[100], b[100]; char s[100]; scanf("%s", s); n = strlen(s); for(i = 0; i < n; i++) { a[i] = s[i] - '0'; printf("%d", a[i]); } printf(" "); while(n != 1) { n = f(a, b, n); for(i = 0; i < n; i++) { a[i] = b[n - i - 1]; printf("%d", a[i]); } printf(" "); } return 0; }
测试结果
下一篇:CTRL+N新建