
C语言关于自守数的字典序输出
/*个位数:x%10十位数:x/100%10百位数:x/1000%100千位数:x/10000%1000万位数:x/100000%10000*/#include<stdi...
/* 个位数:x%10 十位数:x/100%10
百位数:x/1000%100 千位数:x/10000%1000
万位数:x/100000%10000 */
#include<stdio.h>
long Re0(long a);
int Fact(int a);
main()
{
long p=0,chino,i,guess;
scanf("%ld",&chino);
for(i=1;i<=chino;i++)
{
guess=Re0(i);
if(guess==i)
{
if(p==1) printf(" ");
printf("%d",i);
p=1;
}
}
}
int Fact(int a)
{
if(a==0||a==1)
return 1;
else if(a>1)
return a*Fact(a-1);
}
long Re0(long a) //计算各个位数之和
{
long sum;
int A,B,C,D,E; //分别为个位、十位、百位、千位、万位
if(a<10)
return Fact(a);
else if(a>=10&&a<100)
{
A=a%10;
B=a/10;
sum=Fact(A)+Fact(B);
return sum;
}
else if(a>=100&&a<1000)
{
A=a%10;
B=a%100/10;
C=a/100;
sum=Fact(A)+Fact(B)+Fact(C);
return sum;
}
else if(a>=1000&&a<10000)
{
A=a%10;
B=a%100/10;
C=a%1000/100;
D=a/1000;
sum=Fact(A)+Fact(B)+Fact(C)+Fact(D);
return sum;
}
else if(a>=10000&&a<100000)
{
A=a%10;
B=a%100/10;
C=a%1000/100;
D=a%10000/1000;
E=a/10000;
sum=Fact(A)+Fact(B)+Fact(C)+Fact(D)+Fact(E);
return sum;
}
}
代码如上当输入99999时,输出结果为1 2 145 40585
如何让它按照字典序排列使得其输出结果为1 145 2 40585呢?
题目错了,这个是阶乘和数不是自守数。。。 展开
百位数:x/1000%100 千位数:x/10000%1000
万位数:x/100000%10000 */
#include<stdio.h>
long Re0(long a);
int Fact(int a);
main()
{
long p=0,chino,i,guess;
scanf("%ld",&chino);
for(i=1;i<=chino;i++)
{
guess=Re0(i);
if(guess==i)
{
if(p==1) printf(" ");
printf("%d",i);
p=1;
}
}
}
int Fact(int a)
{
if(a==0||a==1)
return 1;
else if(a>1)
return a*Fact(a-1);
}
long Re0(long a) //计算各个位数之和
{
long sum;
int A,B,C,D,E; //分别为个位、十位、百位、千位、万位
if(a<10)
return Fact(a);
else if(a>=10&&a<100)
{
A=a%10;
B=a/10;
sum=Fact(A)+Fact(B);
return sum;
}
else if(a>=100&&a<1000)
{
A=a%10;
B=a%100/10;
C=a/100;
sum=Fact(A)+Fact(B)+Fact(C);
return sum;
}
else if(a>=1000&&a<10000)
{
A=a%10;
B=a%100/10;
C=a%1000/100;
D=a/1000;
sum=Fact(A)+Fact(B)+Fact(C)+Fact(D);
return sum;
}
else if(a>=10000&&a<100000)
{
A=a%10;
B=a%100/10;
C=a%1000/100;
D=a%10000/1000;
E=a/10000;
sum=Fact(A)+Fact(B)+Fact(C)+Fact(D)+Fact(E);
return sum;
}
}
代码如上当输入99999时,输出结果为1 2 145 40585
如何让它按照字典序排列使得其输出结果为1 145 2 40585呢?
题目错了,这个是阶乘和数不是自守数。。。 展开
2个回答
展开全部
#include<stdio.h>
long Re0(long a);
int Fact(int a);
main()
{
long array[1000];
char str[1000][1000];
char t[1000];
int m = 0;
int k = 0;
int j;
long p=0,chino,i,guess;
scanf("%ld",&chino);
for(i=1;i<=chino;i++)
{
guess=Re0(i);
if(guess==i)
{
array[k++] = i;
}
}
for(i = 0; i <k ;i++)
{
sprintf(str[i],"%d",array[i]);
}
for (i = 0; i < k - 1; i++) //将字符串排序
{
for (j = 0; j < k - 1 - i;j++)
if (strcmp(str[j], str[j + 1]) > 0)
{
strcpy(t, str[j]);
strcpy(str[j], str[j + 1]);
strcpy(str[j+1], t);
}
}
for (i = 0; i < k; i++) //输出
{
if(i == k-1)
printf("%s",str[i]);
else
printf("%s ",str[i]);
}
}
int Fact(int a)
{
if(a==0||a==1)
return 1;
else if(a>1)
return a*Fact(a-1);
}
long Re0(long a) //计算各个位数之和
{
long sum;
int A,B,C,D,E; //分别为个位、十位、百位、千位、万位
if(a<10)
return Fact(a);
else if(a>=10&&a<100)
{
A=a%10;
B=a/10;
sum=Fact(A)+Fact(B);
return sum;
}
else if(a>=100&&a<1000)
{
A=a%10;
B=a%100/10;
C=a/100;
sum=Fact(A)+Fact(B)+Fact(C);
return sum;
}
else if(a>=1000&&a<10000)
{
A=a%10;
B=a%100/10;
C=a%1000/100;
D=a/1000;
sum=Fact(A)+Fact(B)+Fact(C)+Fact(D);
return sum;
}
else if(a>=10000&&a<100000)
{
A=a%10;
B=a%100/10;
C=a%1000/100;
D=a%10000/1000;
E=a/10000;
sum=Fact(A)+Fact(B)+Fact(C)+Fact(D)+Fact(E);
return sum;
}
}
展开全部
先把所有的数存下来 而不是马上输出
然后,按照字典序比较
这一步 最好可以存成字符串 然后用字符串比较 更方便一些。
然后,按照字典序比较
这一步 最好可以存成字符串 然后用字符串比较 更方便一些。
追问
那具体如何操作呢?我也想到过这个方法,但觉得很难操作,能具体演示一下吗?
追答
开一个二维数组
比如
char result[100][20];
开一个数,记录已有的
int n=0;
当找到一个自守数时
sprintf(result[n], "%d", i);
n++;
循环结束,再对result数组 进行字符串排序。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询