C程序用漂亮的属性找到正整数
C program to find positive integers with beautiful property
我编写了一个 C 程序来搜索具有这种 属性:
的正整数
很明显我希望程序至少输出数字262144
,但我的程序没有输出这个。 1
也有这个 属性,我的程序确实输出了这个。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
long double digitspow(long int num){
char numstr[30];
sprintf(numstr,"%ld",num);
int n=strlen(numstr);
int digits[n];
long int total=((int) numstr[0])-48;
for (int i=1; i<n;i++){
digits[i]=((int) numstr[i])-48;
total=pow(total,digits[i]);
}
return sqrt(total);
}
int main()
{
long int num;
for (int i=1;i<20000000;i++){
num=i;
if (abs(num - digitspow(num))<0.0000001){
printf("%ld\n",num);
}
}
我会回答我自己的问题。错误在于我计算指数的方式,程序正在计算,例如如果 num=262144
,则此 (((((2^6)^2)^1)^4)^4)
而不是 2^(6^(2^(1^(4^(4)))))
。
所以这是一个解决方案:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
long double digitspow(long long int num){
char numstr[30];
sprintf(numstr,"%ld",num);
long int n=strlen(numstr);
int digits[n];
long long int total=((int) numstr[n-1])-48;
//computing exponent here:
//
for (int i=n-2; i>=0;i--){
digits[i]=((int) numstr[i])-48;
total=pow(digits[i], total);
}
//
return sqrt(total);
}
int main()
{
long long int num;
for (long long int i=1;i<262200;i++){
num=i;
if (abs(num - digitspow(num))<0.0000001){
printf("%lld\n",num);
printf("%lf\n",digitspow(num));
}
}
}
我编写了一个 C 程序来搜索具有这种 属性:
的正整数很明显我希望程序至少输出数字262144
,但我的程序没有输出这个。 1
也有这个 属性,我的程序确实输出了这个。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
long double digitspow(long int num){
char numstr[30];
sprintf(numstr,"%ld",num);
int n=strlen(numstr);
int digits[n];
long int total=((int) numstr[0])-48;
for (int i=1; i<n;i++){
digits[i]=((int) numstr[i])-48;
total=pow(total,digits[i]);
}
return sqrt(total);
}
int main()
{
long int num;
for (int i=1;i<20000000;i++){
num=i;
if (abs(num - digitspow(num))<0.0000001){
printf("%ld\n",num);
}
}
我会回答我自己的问题。错误在于我计算指数的方式,程序正在计算,例如如果 num=262144
,则此 (((((2^6)^2)^1)^4)^4)
而不是 2^(6^(2^(1^(4^(4)))))
。
所以这是一个解决方案:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
long double digitspow(long long int num){
char numstr[30];
sprintf(numstr,"%ld",num);
long int n=strlen(numstr);
int digits[n];
long long int total=((int) numstr[n-1])-48;
//computing exponent here:
//
for (int i=n-2; i>=0;i--){
digits[i]=((int) numstr[i])-48;
total=pow(digits[i], total);
}
//
return sqrt(total);
}
int main()
{
long long int num;
for (long long int i=1;i<262200;i++){
num=i;
if (abs(num - digitspow(num))<0.0000001){
printf("%lld\n",num);
printf("%lf\n",digitspow(num));
}
}
}