我被要求写一个代码来找到N位数(3<=N<=7)的自恋数字,但我总是在输入7时遇到超时问题。我该怎么办?
下面是我的代码:
#include<stdio.h>
#include<math.h>
int narcissistic(int num,int n);
int main(){
int n;
int i,min,max;
scanf("%d",&n);
max=pow(10,n)-1;
min=pow(10,n-1);
for(i=min;i<=max;i++){
if(nacissistic(i,n)){
printf("%d\n",i);
}
}
return 0;
}
int narcissistic(int num,int n){
int renum=num,sum=0;
int digit;
while(renum!=0){
digit=renum%10;
renum=renum/10;
sum+=pow(digit,n);
if(sum>num){
break;
}
}
return(sum==num);
}
字符串
我尝试将数据类型从int转换为double,但没有成功。
4条答案
按热度按时间nuypyhwy1#
自恋数字
如果我们谈论n位数,那么k是一个自恋数,如果:
最重要的是,让我们使用一个查找表,这样你就可以精确地计算数字的9次幂,而不是n *(10^(n+1)- 10^n)次。当然,我也修复了错别字:
字符串
我在初始实现和查找表改进之间做了一些基准测试,通过:
型
差别很大。这是输出:
型
注意,如果n = 1,那么0会丢失。你可能想科普这种情况,比如如果n为1,则将min设置为0。
erhoui1w2#
这可能是更简单的代码,我试过了。
字符串
如果您有任何问题,请随时添加评论。
fae0ux8s3#
好吧,尽管你没有说什么是自恋的数字(我不得不调试你的代码来猜测),但你的代码在我的系统中运行良好,产生正确的答案(尽管使用了数学
pow()
函数,它应该给出给予正确的结果-除非你超过了2^53的精度限制,这不是事实-)我已经减少了你的代码,使它更容易阅读(编译器不会为你使用的空格数向你收费)我已经添加了一个快速的幂计算函数,使用
long unsigned
数字,以允许完全64位精度。结果是这样的(它产生的结果与其他答案中给出的结果相同):字符串
lyfkaqu14#
这个答案很容易理解。
字符串