题目
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1 ^3 +5 ^3+3 ^3
。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数接口定义:
int narcissistic( int number );
void PrintN( int m, int n );
函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。
函数PrintN则打印开区间(m, n)内所有的水仙花数,每个数字占一行。题目保证100≤m≤n≤10000。
裁判测试程序样例:
#include <stdio.h>
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
153 400
结尾无空行
输出样例:
153 is a narcissistic number
370
371
结尾无空行
正确答案
int narcissistic( int number )
{
int nu=number;
int temp=0;
while(nu)
{
nu/=10;
temp++;
}
nu=number;
int sum=0;
int index;
while(number)
{
int i;
int t=number%10;
index=1;
for(i=1;i<=temp;i++)
index*=t;
sum+=index;
number/=10;
}
if(sum==nu) return 1;
else return 0;
}
void PrintN( int m, int n )
{
int i;
for(i=m+1;i<n;i++)
{
int temp=narcissistic(i);
if(temp==1) printf("%d\n",i);
}
}
错误解析
int narcissistic( int number )
{
int i1,i2,i3;
int flag = 0;
i1 = number%10;
i2 = number/10%10;
i3 = number/100;
// printf("计算%d %d %d %d\n",number,i1,i2,i3);
// printf("%d ",i1*i1*i1+i2*i2*i2+i3*i3*i3);
if(number == i1*i1*i1+i2*i2*i2+i3*i3*i3)
{
flag = 1;
}
return flag;
}
void PrintN( int m, int n )
{
int i;
for(i=m+1;i<n;i++)
{
if(narcissistic(i))
printf("%d\n",i);
}
}
- 测试点123未通过
- 分析原因
分别测试
- m最小,n另外输出;
- m==n要输出;
- 最大区间;
看别的博客才发现是审题错误,是n次方,不是三次方要计算数字的位数
int narcissistic( int number )
{
int i,j,mi,k,sum,num,jusum;
num = number;
jusum = 1;
int a[4];
for(i=0;i<4;i++)
a[i]=0;
mi=0;
i=0;
sum = 0;
while(number)
{
mi++;
a[i]=number%10;
// printf("%d ",a[i]);
i++;
number = number/10;
}
// printf("\n");
// printf("%d\n",mi);
for(j=0;j<=i;j++)
{
jusum = 1;
for(k=0;k<mi;k++)
jusum *= a[j];
// printf("%d ",jusum);
sum=sum+jusum;
}
// printf("number = %d sum = %d\n",num,sum);
if(sum==num)
return 1;
else
return 0;
}
void PrintN( int m, int n )
{
int i;
if(m<100||m==n||n>10000)
{
}
else{
for(i=m+1;i<n;i++)
{
if(narcissistic(i))
printf("%d\n",i);
}}
}
还是错误,啊啊啊啊
不停打印输出,发现是数组越界了,人生建议不要用数组阿西吧
四位数1634多出一位计算,所以直接将数组长度变大就可,但是不如正确答案迭代来得方便快捷
改正后
//int narcissistic( int number )
//{
// int i1,i2,i3;
// int flag = 0;
// i1 = number%10;
// i2 = number/10%10;
// i3 = number/100;
printf("计算%d %d %d %d\n",number,i1,i2,i3);
printf("%d ",i1*i1*i1+i2*i2*i2+i3*i3*i3);
// if(number == i1*i1*i1+i2*i2*i2+i3*i3*i3)
// {
// flag = 1;
// }
//
// return flag;
//}
int narcissistic( int number )
{
int i,j,mi,k,sum,num,jusum;
num = number;
jusum = 1;
int a[5];
for(i=0;i<5;i++)
a[i]=0;
mi=0;
i=0;
sum = 0;
while(number)
{
mi++;
a[i]=number%10;
// printf("%d ",a[i]);
i++;
number = number/10;
}
// printf("\n");
// printf("%d\n",mi);
for(j=0;j<=i;j++)
{
jusum = 1;
for(k=0;k<mi;k++)
jusum *= a[j];
// printf("%d ",jusum);
sum=sum+jusum;
}
// printf("number = %d sum = %d\n",num,sum);
if(sum==num)
return 1;
else
return 0;
}
void PrintN( int m, int n )
{
int i;
if(m<100||m==n||n>10000)
{
}
else{
for(i=m+1;i<n;i++)
{
if(narcissistic(i))
printf("%d\n",i);
}}
}
评论答疑
错误代码
int narcissistic( int number ){
int n=number,tmp=number,sum=0,m,count=0,index=1;
while(n!=0){
n/=10;
count++;
}
while(tmp!=0){
//每次循环都没有将index置一,导致算出没有水仙数
//应当添加
//index = 1;
m=tmp%10;
for(int i=1;i<=count;i++)
index*=m;
sum+=index;
tmp/=10;
}
if(number==sum)
return 1;
else
return 0;
}
void PrintN( int m, int n ){
for(int i=m;i<=n;i++){
//i=m;i<=n,这里将m,n重复计算了,所以输出也会有错,
//应当改为
//for(i=m+1;i<n;i++){
int temp=narcissistic(i);
if(temp==1)
printf("%d\n",i);
}
}
修改过后
#include <stdio.h>
int narcissistic( int number );
void PrintN( int m, int n );
int main()
{
int m, n;
scanf("%d %d", &m, &n);
if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m);
PrintN(m, n);
if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n);
return 0;
}
int narcissistic( int number ){
int i;
int n=number,tmp=number,sum=0,m,count=0,index=1;
while(n!=0){
n/=10;
count++;
}
while(tmp!=0){
index = 1;
m=tmp%10;
for(i=1;i<=count;i++)
index*=m;
sum+=index;
tmp/=10;
}
if(number==sum)
return 1;
else
return 0;
}
void PrintN( int m, int n ){
int i;
for(i=m+1;i<n;i++){
int temp=narcissistic(i);
if(temp==1)
printf("%d\n",i);
}
}
具体改正
我在错误代码里有注释,对应讲解应该更方便
错误有有两处
1.
while(tmp!=0){
//每次循环都没有将index置一,导致算出没有水仙数
//应当添加
//index = 1;
m=tmp%10;
for(int i=1;i<=count;i++)
index*=m;
sum+=index;
tmp/=10;
}
void PrintN( int m, int n ){
for(int i=m;i<=n;i++){
//i=m;i<=n,这里将m,n重复计算了,所以输出也会有错,
//应当改为
//for(i=m+1;i<n;i++){
int temp=narcissistic(i);
if(temp==1)
printf("%d\n",i);
}
}