高分求解C语言编程题

编写程序验证以下说法:输入一个4位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数-最小数,构成一个新的4位数。反复以上运算,使其最终结果为:6174。
要求如下(下面的函数名为建议函数名):
① 用函数 int IsNumberEqual(int number) 检查输入的整数number各数码是否互不相等,有相等返回值为1否则为0;
② 用函数(void ntos (int number, int c[]) )把四位数整数number各位数码分别存入数组c
③ 用函数( void sort (int a[ ] )对4个元素的数组a排序(升序或降序都可以);
④ 由输入整数分解排序后的数组得到最大值和最小值:
int getmaxn(int a[ ]) 返回值为最大值
int getminn(int b[ ]) 返回值为最小值

#include<stdio.h>

int IsNumberEqual(int number);
void ntos (int number, int c[]);
void sort (int a[]);
int getmaxn(int a[]);
int getminn(int b[]);

int main()
{
int num;
int s[4];
int i;

do
{
printf("Input:");
scanf("%d",&num);
}while(IsNumberEqual(num));

i=0;
while(num!=6174 & i<10000)
{
ntos(num,s);
sort(s);
num=getmaxn(s)-getminn(s);
i++;
}
printf("Total:%d\n",i);

//system("PAUSE");
return 0;
}

int IsNumberEqual(int number)
{
int s[4];
ntos(number,s);
if(s[0]==s[1] ||s[1]==s[2] ||s[2]==s[3] ||s[3]==s[0]) return 1;
return 0;
}

void ntos (int number, int c[])
{
c[0]=number/1000;
number%=1000;
c[1]=number/100;
number%=100;
c[2]=number/10;
number%=10;
c[3]=number;
}

void sort(int a[])
{
int i,j,temp;
for(i=0;i<3;i++)
for(j=i+1;j<4;j++)
{
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}

int getmaxn(int a[])
{
return a[3]*1000+a[2]*100+a[1]*10+a[0];
}
int getminn(int b[])
{
return b[0]*1000+b[1]*100+b[2]*10+b[3];
}

输出迭代次数,超过10000次就结束(不过貌似不会发生)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-05
1.将输入的int转成char*
2.分别取出char*里的字符存入int数组
3.比较int数组中各个元素是否相等
4.数组排序,取得最大和最小数转字符存入char*.存完转int
5.用最大减去最小.
6.如果结果等于6174程序结束,输出.否则将结果转char*跳第2部
第2个回答  2010-01-05
mark
第3个回答  2010-01-05
我才学了一个月的c++,对C不太熟悉,下面的程序最好自己编译一遍。我今天装VS2008装错了路径,现在得重装……,下面是源代码:
/*
编写程序验证以下说法:输入一个4位数,该数个、十、百、千位上的数互不相等,由个、十、百、千位上的数组成一个最大数和一个最小数,最大数-最小数,构成一个新的4位数。反复以上运算,使其最终结果为:6174。
要求如下(下面的函数名为建议函数名):
① 用函数 int IsNumberEqual(int number) 检查输入的整数number各数码是否互不相等,有相等返回值为1否则为0;
② 用函数(void ntos (int number, int c[]) )把四位数整数number各位数码分别存入数组c
③ 用函数( void sort (int a[ ] )对4个元素的数组a排序(升序或降序都可以);
④ 由输入整数分解排序后的数组得到最大值和最小值:
int getmaxn(int a[ ]) 返回值为最大值
int getminn(int b[ ]) 返回值为最小值
win32项目
*/
//#include <iostream>
#include <stdio.h>
#include <conio.h>
int IsnumberEqual(int numA);//检查输入的整数number各数码是否互不相等,有相等返回值为1否则为0;
void ntos (int numB, int c[]);//把四位数整数number各位数码分别存入数组c
void sort (int s[]);//对4个元素的数组a排序
int getmaxn(int a[]);//返回值为最大值
int getminn(int b[]);//返回值为最小值
int main()
{
int num0 = 0;//保存第一次正确输入的数。
int num1 = 0;//用于之后操作的数。
int count=0;//用于记录运算次数
int ch[4];//保存当前数的字符数组
while(1)
{//只有正确输入才能跳出循环
//这里最好有个清屏的函数,我忘了是什么了……
printf("请输入一个各位都不相同的四位数:");//std::cout <<"……";
scanf("%d",num0);//std::cin >> num0;
if(num0 >= 1023 && num0 <= 9876//各位数都不相同的四位数,首位最小为1,最大为9,次位最小为0,最大为8,第三位最小为2,最大为7,最后位最小为3,最大为6
&&(!IsnumberEqual(num0)))
break;//只有正确输入才能跳出死循环
}
num1 = num0;//之后不对num0进行操作.
while(num1!=6174)
{//只有运算至最终结果时才跳出循环
ntos(num1,ch);
sort(ch);
num1=getmaxn(ch)-getminn(ch);
count++;
}
printf("%d经过%d次运算得到了6174!",num0,count);//std::cout << num0 <<"经过了" << count << "次运算得到了6174!" << std::endl;
getch();//等待用户
return 0;
}
int IsnumberEqual(int numA)
{
int cha[4];//如果ntos()里的第二个参数可以去掉,然后把ch[4]定义为全局变量,程序应该再可以小小的优化下
ntos(numA,cha);
if(cha[0]==cha[1]||cha[0]==cha[2]||cha[0]==cha[3])
return 1;
else if(cha[1]==cha[2]||cha[1]==cha[3])
return 1;
else if(cha[2]==cha[3])
return 1;
else return 0; //我认为这样顺眼些,容易读,而且不易弄错
}
void ntos (int numB, int c[])
{
int numC;//不能直接对num1操作
numC=numB;
for(int i=3;i>=0;i++){
c[i]=numC%10;
numC/=10;//获取了个位之后将个位丢弃
}
}
void sort (int s[])
{
int i,j,mid;
for(i=0;i<3;i++)
for(j=i+1;j<4;j++)//冒泡排序
{
if(s[i]>s[j])//如果后一位比前一位小,则向后移,最终得到的是一个最小数
{
mid=s[i];
s[i]=s[j];
s[j]=mid;
}
}
}
//在调用以下两个函数之前一定会调用sort()
int getmaxn(int a[])
{
return a[3]*1000+a[2]*100+a[1]*10+a[0];
}
int getminn(int b[])
{
return b[0]*1000+b[1]*100+b[2]*10+b[3];
}
//应该没错了。我重装VS2008之后再编译试试。
第4个回答  2010-01-05
#include <stdio.h>
void ntos(int number,int *a)//将输入的整数放在一个数组中,方便其它函数的操作
{
int temp;
int i=0;
while(number>0)
{
temp=number%10;
a[i++]=temp;
number/=10;
}
}
int IsNumberEqual(int *a)//如果返回值为1,则表示没有雷同数
{
int i,j;
for (i=0;i<3;i++)
{
for (j=i+1;j<4;j++)
{
if(a[i]==a[j])
{
return 0;
break;
}
}
}
return 1;
}
void sort (int *a)//排序(升序)
{
int i,j;
int temp=0;
for (i=0;i<3;i++)
{
for (j=i+1;j<4;j++)
{
if (a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
int getmaxn(int *a)//返回最大值(逆序数组)
{
int number=0,j=1000;
int i,x;
sort(a);
for (i=3;i>=0;i--)
{
x=a[i];
number=number+x*j;
j=j/10;
}
return number;
}
int getminn(int *a)//返回最小值(升序数组)
{
int number=0,j=1000;
int i,x;
sort(a);
for (i=0;i<4;i++)
{
x=a[i];
number=number+x*j;
j=j/10;
}
return number;
}
void main()
{
int a[4];
int number,count=0;
printf("请输入数据:");
scanf("%d",&number);
while (number>9999||number<1000)
{
printf("请输入一个四位数:");
scanf("%d",&number);
}
ntos(number,a);
sort(a);
while (number!=6174)
{
if (IsNumberEqual(a))
{
ntos(number,a);
sort(a);
number=getmaxn(a)-getminn(a);
count++;
}
else if (IsNumberEqual(a)==0)
{
printf("出现重复值,程序退出!!\t");
break;
}
}
if (IsNumberEqual(a))
{
printf("程序正常执行,过程中未碰到雷同数!\t");
}
printf("程序计算次数是:%d\n",count);
}
经调试运行无误!!!!!
相似回答