问题来源:PTA 拓展水仙花数题目中使用了pow&to_string函数后超时
具体题目:
扩展水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次方之和等于它本身。例 如:153 =13+ 53+ 33。 要求编写程序,输出所有扩展水仙花数。
输入格式:
首先输入一个整数T(1<=T<10),表示测试组数;每组测试在一行上输入一个正整数N(3<=N<=7)。
输出格式:
对于每组测试,按递增顺序输出所有扩展水仙花数,每个数字占一行。
输入样例:
1
3
输出样例:
153
370
371
407
错误代码呈现
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t, n;
cin >> t;
int sum = 0;
while (t--)
{
cin >> n;
for (int i = pow(10, n - 1); i < pow(10, n); i++)
{
string s = to_string(i); //讲数字转换成字符串
for (int j = 0; j < s.size(); j++)
{
int k = s[j] - 48;
int tmp = pow(k,n);
sum += tmp;
}
if (sum == i)
cout << i << endl;
sum = 0;
}
}
return 0;
}
AC Code:
#include <bits/stdc++.h>
using namespace std;
//自定义一个函数 实现pow
int mul(int a, int b)
{
int tmp = a;
for(int i=1; i<b; i++)
tmp *= a;
return tmp;
}
int main()
{
int t, n, w,a[10],tmp;
cin >> t;
int sum = 0;
while (t--)
{
cin >> n;
for (int i = mul(10,n-1); i < mul(10, n); i++)
{
//实现to_string的过程
int cnt=0;
w = i;
while(w!=0)
{
a[cnt++]=w%10;
w /= 10;
}
for(int j=0; j<n; j++)
{
tmp = a[j];
sum += mul(tmp, n);
}
if (sum == i)
cout << i << endl;
sum = 0;
}
}
return 0;
}
其实把乘积函数在main函数中单独写出来,比单独写个函数再去调用可能效率更高(
但我这种也过了hh)在日后遇到卡时间复杂度的题,可以在pow和to_string上做优化处理
对于具体的pow和to_string实现暂时还没找到,如果有知道的并且愿意分享的万分感谢您