一.题目概要:
从键盘中输入三个数(m,n,s),n为位数,每位数的最大值为m,位数之和为s,请求出所有不重复的结果。
二.算法分析:
(1)定义数字的取值范围,拿三位数举例,三位数的范围为100~mmm。代码如下:
int n,m,s;
int min=1,max;
printf("所输入的数字位数:");
scanf("%d",&n);
printf("每位数最大值:");
scanf("%d",&m);
printf("所有位之和为:");
scanf("%d",&s);
int a[n];
for(int i=0;i<n-1;i++)
min=min*10;
max=m;
for(int i=0;i<n-1;i++)
{
max=max*10+m;
}
(2)进行循坏判断(本次拿四位数进行举例),从键盘中分别输入4,6,6。在循环前定义一个x变量,用来找出满足条件的数字。然后分别取出它的每位数的数字,再将他们加起来,与键盘中所输入的m值进行比较。
while(x)
{
a[i++]=x%10;
x/=10;
}
for(int j=0;j<n;j++)
sum+=a[j];
(3)与m比较,若满足,则将它们的每位数的数字按一定排序方法排序,为什么这么做呢?因为题目中要求不能出现重复的结果,也就是说进行判定后,我们还要筛选一下,把位数数字相同的给排除掉,所以我们可以先利用之前求和用到的数字,来对位数进行排序,排完之后,再将他们转为4位数,注意:别把0放在第一位,不然编译运行时,可能会变为三位数。
if(sum==s)
{
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
x=a[0];
for(i=0;i<n-1;i++)
x=x*10+a[i+1];
if(x==num)
printf("%d\n",num);
三.代码展示:
#include<stdio.h>
int main()
{
int n,m,s;
int min=1,max;
printf("所输入的数字位数:");
scanf("%d",&n);
printf("每位数最大值:");
scanf("%d",&m);
printf("所有位之和为:");
scanf("%d",&s);
int a[n];
for(int i=0;i<n-1;i++)
min=min*10;
max=m;
for(int i=0;i<n-1;i++)
{
max=max*10+m;
}
printf("%d,%d\n",min,max);
int num,temp;
for(num=min;num>=min && num<=max;num++)
{
int sum=0;
int i=0;
int x=num;
while(x)
{
a[i++]=x%10;
x/=10;
}
for(int j=0;j<n;j++)
sum+=a[j];
if(sum==s)
{
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]<a[j])
{
temp=a[j];
a[j]=a[i];
a[i]=temp;
}
}
}
x=a[0];
for(i=0;i<n-1;i++)
x=x*10+a[i+1];
if(x==num)
printf("%d\n",num);
}
}
return 0;
}
四.结果: