2,math.h中的函数用的时候猛碰要慎重,这些都是用来做复杂的数学计算的,时间开销都很大。
3,求余只能对整数 *** 作,这点是必然的。但浮点数是枝举谈可答慧以转换成整数的,可以用强制类型转换,或者设一个整型的中间变量。注意浮点数转整数的时候是舍入的。当然,这里只是说这个事,不建议这样做。
建议的做法有两个,简单点延用原有的思路,可以自己写一个求10的k次方的函数,用整数进行运算。
int pow10n( int k )
{
r = 1
for(i=0i <k ++i)
r *= 10
return r
}
复杂点的做法是把求10的k次方这个运算和拆分n的循环嵌在一起,这个应该是正统的做法。
for( k=0k<3++k )
{
n %= 10
}
当然,这个算法得到的结果是逆序的,4、3、2、1
这有两个办法,一个是把结果顺序放到数组中,输出的时候把顺序倒过来,说白了是用中间变量。
另外一个办法是用栈,或者用递归(本质上也是用的栈),直接按逆序出结果。当然,这个方法对初学者有点难度了。
#include<stdio.h>#include<math.h>
int main()
{
int sum=0
int n,a
乱凳 scanf("%d", &n)
for (int i=1i<=ni++)
宏扰 {
a=pow(2,i)
sum=+sum
}
printf("%d\n"哗绝旅, sum)
return 0
}
#include<stdio.h>#include<stdlib.h>
#define MAX_NUMBER_LENGTH 10
/*计算阶乘
参数:
n 基数
p 幂,大于等于 0
返回:
n的p次方
*/
int myPow(int n,unsigned int p)
{
int r=1
while(p--) r*=n
return r
}
/*计算指定长度的 armstrong 数
参数:
length armstrong数的位数
返回:
长度为 length 的armstrong数个数
*/
int armstron(int length )
{
int counter=0
int min=myPow(10,length-1)
int max=myPow(10,length)-1
int i,j,n,sum
int stack[MAX_NUMBER_LENGTH],stackTop=-1
// 遍历所有长度为 length 的数字
for(i=mini<=maxi++)
{
n=i
stackTop=-1
// 分离出数字 n 的每一位
do
{
stack[++stackTop]=n%10
n/=10
}while(n)
n=i
// 求数字 n 的每一位N次方之和
sum=0
for(j=0j<=stackTopj++)
{
sum+=myPow(stack[j],stackTop+1)
}
// 数字 n 每一位N次方之和等于 n,即为 armstrong 数。输出。
if(sum==n)
{
printf("盯昌%d = ",n)
for(j=stackTopj>=0j--)
{
printf("%d^%d",stack[j],(stackTop+1))
if(j>0)
printf(" + ")
}
printf("\n"陪则桥)
}
}
}
int main()
{
int len
for(len=2len<=4len++)
{
armstron(len)
}
system("pause")
}
/*
153 = 1^3 + 5^3 + 3^3
370 = 3^3 + 7^3 + 0^3
371 = 3^3 + 7^3 + 1^3
407 = 4^3 + 0^3 + 7^3
1634 = 1^4 + 6^4 + 3^4 + 4^4
8208 = 8^4 + 2^4 + 0^4 + 8^4
9474 = 9^4 + 4^4 + 7^4 + 4^4
*/芦猛
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)