高分求解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);
}
经调试运行无误!!!!!

高分求解,C语言数组,为什么如图程序执行结果是12345,条件循环语句看不太...
你理解错了for语句 假设for语句是如下形式:for(语句1;语句2;语句3){内容},则for的执行顺序如下:语句1(只执行一次)语句2(判断不通过则退出for)内容 语句3 语句2(判断不通过退出for)内容 语句3 语句2(判断不通过退出for)...所以打印的是p[0],p[1], p[2], p[3],p[4]即12345,a...

两道C语言的题,求解(高分)
int min(int a,int b,int c){ if (a<=b&&a<=c)return a;if (b<=a&&b<=c)return b;else return c;}

编程C语言 输入n个学生成绩,计算他们的平均值并输出所有高于平均的学生...
思路:定义一个数组用于保存n个学生的成绩,输入他们的成绩的时候统计总分,并计算出他们的平均分,在来一个循环,让n个学生的成绩分别和平均分进行比较,满足大于平均分则输出 \/\/c语言实现 include<stdio.h> define MAX 100 int main(){ int n,i;double score[MAX],average,sum=0;printf("\\n输...

高分求编程题程序(C语言)
1.怎么拆分一个文件?如果一个文件是5.30004MB该怎么拆?拆到B为止?组装是怎么组装?随机合并?2.你的例子到底是二进制还是十六进制?为什么0是000000b?3.输入是什么?文本文件?还是从终端输入?密匙是提前决定还是程序运行的时候决定?4.这个还好。试着做做吧。5.这个无聊到极点,要不要把全国各...

高分求解C语言编程题
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...

高分求一道C语言程序 急
printf("请输入一元多项式%c:(格式:系数 指数,以0 0结束.)\\n",ch);scanf("%f %d",&x,&y);while(x!=0){inpt=(PLOY *)malloc(sizeof(PLOY));\/\/创建新链节 inpt->coef=x;inpt->expn=y;inpt->next=NULL;insert(head,inpt);\/\/不然就查找位置并且插入新链节 scanf("%f %d",&x,&y...

c++问题,高分求解 a[100]={1,2,3,4,5,6,7,8}; 怎样得出a数组的长度为...
你定义的数组是a[100],那这个数组的长度就是100,不可能是八的;想要数组长度为八你要这样定义a[ ]={1,2,3,4,5,6,7,8},这样因为数组的长度没有给定,所以他会根据你给它附的初值自动分配数组大小,此处有八个数所以数组长度会是八;或者这样定义a[8]={1,2,3,4,5,6,7,8},这样...

C语言习题求助,编译通过,运行错误,高分求解
exit(1) ; \/* 若内存分配失败,退出应用程序,否则的话,严重的话,就有可能使系统崩溃!!! *\/ } strcpy(p, "This is a test string") ; \/* 内存分配成功,将字符串的内容复制到 p 中 *\/ } 例如:再对于(2)而言:void main( ){ int num ;scanf("%d", &num) ;if( num ==...

C语言求解
if(c=='n'||c=='N') break; \/*如果不删除,则跳出本循环*\/ if(c=='y'||c=='Y') { if(p1==head) \/*若p1==head,说明被删结点是首结点*\/ head=p1->next; \/*把第二个结点地址赋予head*\/ else p2->next=p1->next; \/*否则将一下结点地址赋给前一结点地址*\/ n=n-1; printf("\\n...

c语言求解:有三个学生每个学生有四门课,从键盘输入学生的成绩统计每门...
subjects[4];} ;void main(){ struct student students[3];int i,j,max;printf("请依次输入学号,及3门科目的成绩!\\n);for(i=0;i<3;i++){ printf("第%d个学生,学号:\\n",i);scanf("%s",students[i].student_id);printf("输入成绩成绩\\n:);for(j=0;j<4;j++){ printf("第...

相似回答
大家正在搜