Project Euler:Problem 56 Powerful digit sum

来源:互联网 发布:linux hadoop安装 编辑:程序博客网 时间:2024/05/15 04:57

A googol (10100) is a massive number: one followed by one-hundred zeros; 100100 is almost unimaginably large: one followed by two-hundred zeros. Despite their size, the sum of the digits in each number is only 1.

Considering natural numbers of the form, ab, where a, b < 100, what is the maximum digital sum?



大数乘法

基本上就是从前面做过的29题那里copy来的代码


#include <iostream>#include <string>using namespace std;string num2str(int n){string ans = "";while (n){int a = n % 10;char b = a + '0';ans = b + ans;n /= 10;}return ans;}void reverse_data(string &data){char temp = '0';int start = 0;int end = data.size() - 1;while (start < end){temp = data[start];data[start++] = data[end];data[end--] = temp;}}void compute_value(string lhs, string rhs, string &result){reverse_data(lhs);reverse_data(rhs);int i = 0, j = 0, res_i = 0;int tmp_i = 0;int carry = 0;for (i = 0; i != lhs.size(); ++i, ++tmp_i){res_i = tmp_i;  //在每次计算时,结果存储的位需要增加    for (j = 0; j != rhs.size(); ++j){carry += (result[res_i] - '0') + (lhs[i] - '0') * (rhs[j] - '0');//此处注意,每次计算并不能保证以前计算结果的进位都消除, 并且以前的计算结果也需考虑。    result[res_i++] = (carry % 10 + '0');carry /= 10;}while (carry)//乘数的一次计算完成,可能存在有的进位没有处理    {result[res_i++] = (carry % 10 + '0');carry /= 10;}}for (int i = result.size() - 1; i >= 0; i--){if (result[i] != '0')break;elseresult.pop_back();}reverse_data(result);}int count_num(string s){int count = 0;for (int i = 0; i < s.length(); i++){count += s[i] - '0';}return count;}int powe(string a, int b){string res = a;for (int ii = 1; ii < b; ii++){string tmp(res.length() + a.length(), '0');compute_value(res, a, tmp);res = tmp;}int count = count_num(res);return count;}int main(){int maxc = 0;for (int a = 1; a < 100; a++){for (int b = 1; b < 100; b++){string s = num2str(a);int ans = powe(s, b);if (ans>maxc)maxc = ans;}}cout << maxc << endl;system("pause");return 0;}



0 0
原创粉丝点击