C语言程序6174问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言程序6174问题相关的知识,希望对你有一定的参考价值。
数字6、1、7、4可以组成最大的数是7641,最小的数是1467,用最大数减去
最小数,结果正好是6174。任取四个阿拉伯数字,用它们组成最大数和最小
数,求得其差。再用差组成的四位数继续做下去,经过数次后结果肯定还
是6174。编程给出求解步骤。并找到需要次数最多的四个数字。
关于这个编一个C语言程序 求高手指点一下
#include"stdio.h"
#include"stdlib.h"
//函数f(a)是利用递归来计算一个四位数计算到6174所用的次数
int f(int a)
int i,j,max,min,cha,temp,num[4]=0;
num[0]=a/1000;
num[1]=(a%1000)/100;
num[2]=(a%100)/10;
num[3]=(a%10);
if (num[1]==num[0] && num[2]==num[0] && num[3]==num[0])
return 0; //如果这个4位数的4个数都相同则返回0
for(i=0;i<=2;i++) //数组中数字按从小到大排序(冒泡排序法)
for(j=0;j<=2;j++)
if(num[j]>num[j+1])
temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
max=num[3]*1000+num[2]*100+num[1]*10+num[0];//最大值
min=num[0]*1000+num[1]*100+num[2]*10+num[3];//最小值
cha=max-min; //最大值与最小值之差
if(cha==6174) //如果差等于6174则返回1
return 1;
else
return f(cha)+1; //如果差不等于6174则进行递归,返回f(cha)+1
main( )
int x,i,temp,maxtimes;
int times[10000]=0;//用来存储递归次数,如6174是1次,则times[6174]=1
for(i=1000;i<=9999;i++)
times[i]=f(i);
maxtimes=times[1000];
temp=1000;
for(i=1000;i<9999;i++)
if(times[i]>maxtimes)
maxtimes=times[i];
temp=i;
printf("需要计算次数最多的4位数是:%d\n",temp);
printf("%d计算到6174所经过的次数是:%d\n",temp,maxtimes);
system("pause");
参考技术A //for循环10次产生10组,比较哪个最多
#include
#include
#include
#define N 10
#define num_1 8999
void vr6174(int);
void parse_sort(int num,int *each);
void max_min(int *each,int *max,int *min);
void parse_sort(int num,int *each);
int count=0;
void main()
int n;
int cou=0,num_max;
srand(time(0)); /*设置种子,并生成伪随机序列*/
for(int i=0;i<N;i++)
printf("第%d组数据\n",i+1);
n=rand()%1000;/*生成0~9999随机数*/
if(n<1000)
n+=1000;
vr6174(n); //调用函数进行验证
if(count>cou)
num_max=n;
cou=count;
count=0;
printf("最大次数:%d,数字是:%d\n",cou,num_max);
void vr6174(int num)
int each[4],max,min;
if(num!=6174&&num) /*若不等于74且不等于0则进行卡布列克运算*/
parse_sort(num,each); /*将整数分解,数字存入each数组中*/
max_min(each,&max,&min); /*求数字组成的最大值和最小值*/
num=max-min; /*求最大值和最小值的差*/
printf("[%d]: %d-%d=%d\n",++count,max,min,num); /*输出该步计算过程*/
vr6174(num); /*递归调用自身继续进行卡布列克运算*/
void parse_sort(int num,int *each)
int i,*j,*k,temp;
for(i=0;i<=4;i++) /*将NUM分解为数字*/
j=each+3-i;
*j=num%10;
num/=10;
for(i=0;i<3;i++) /*对各保数字从小到大进行排序*/
for(j=each,k=each+1;j<each+3-i;j++,k++)
if(*j>*k) temp=*j;*j=*k;*k=temp;
return;
void max_min(int *each,int *max,int *min) /*将分解的数字还原为最大整数和最小整数*/
int *i;
*min=0;
for(i=each;i<each+4;i++) /*还原为最小的整数*/
*min=*min*10+*i;
*max=0;
for(i=each+3;i>=each;i--) /*还原为最大的整数*/
*max=*max*10+*i;
return;
主题思想是递归。第二个问题:并求出需要次数最多的四个数字?什么意思,你产生0~9999的随机数,在做6174。最多次?指的是,你不是把所有的步骤都列出来了。你是不是要加个for循环多产生几个数,再求最多,那就建个数组把每次的次数存起来,最后比较输出吧 参考技术B 楼主,这个程序看似简单,其实太大了,你给的分实在太低了,加到50分以上或许有人肯回答! 参考技术C typedef struct D
int data;
int static k;D[];
int Number(struct D[j])
a=min(D[j].data);
b=max(D[j].data);
n=D[j].data;
D[j].k++;
if(n==6174);
c=max1(D[j]);找到k最大的数;
return(c.data);
else Numeber(b-a);
int main()
struct D a;
for(i=1000;i<10000;i++)
D[j++].data=i;
D[j].k=0;
a=Number(D[j]);
pritf("%d",a.data);
我这个就是个算法,我C语言好长时间没用了,格式上可能存在错误。但是算法应该没问题,希望对你有帮助!
C语言问题
1.用循环结构表达出“1的平方+2的平方+3的平方+4的平方+5的平方……+20的平方”
2.有一种数字叫做水仙数,这种数字有3位且各个位上的立方等于这个数本身例如153=1的立方+5的立方+3的立方
用循环结构找出所有的水仙数 谢谢
Slide 2read语句与readln语句区别是: (1) read语句是一个接一个地读数据,在执行完本Read语句( 读完本语句中变量所需的数据)后,下一个读语句接着从该数据输入行中继续读数据,也就是说,不换行。如: Read(a,b); Read(c,d); Read(e); 如果输入数据行如下: 1□2□3□4□5□6□←┘ 则a,b,c,d,e的值分别为1,2,3,4,5,如果后面无读语句则数据6是多余的,这是允许的。
Slide 3Readln则不同,在读完本Readln语句中变量所需的数据后, 该数据行中剩余的数据多余无用,或者说,在读完本Readln语句中变量所需数据后,一定要读到一个回车,否则多余的数据无用。设有下列语句: read(a,b,c); readln(d,e); readln; readln(f); 其中,所有变量均为整型。再设输入的数据如下: 1□2←┘ 3□4□5□6□7□8←┘ 9□10←┘ 11←┘ 结果为:1 2 3 4 5 11
Slide 4(2)readln语句与read语句的第二个区别是: read 后一定要有参数表, readln可以不带参数表,即可以没有任何输入 项, 只是等待读入一个换行符(回车)。 经常用于暂停程序的运行,直到输入 一个回车
Slide 52、输出语句write和writeln 功能:把程序计算的结果,按适当的形式输出到屏幕或文件。 1)、write语句格式Write(表达式1,表达式2,……);如: write(x,5,a+b); write(‘My name is Liping’); 2)、writeln语句格式: Writeln(表达式1,表达式2,……) 或writeln
Slide 6Write语句与writeln语句格式上都相似,但它们在功能上有所不同,两个语句的区别在于: write语句将其后括号中的表达式一个接一个输出后,没有换行。 而writeln语句则在输出各个表达式的值后换行。例如以下两个程序段的输出分别为: write(1,2,3,4); write(5,6); 输出为: 123456 writeln(1,2,3,4); write(5,6); 输出为: 1234 56
Slide 74)实数的输出格式实数(real)以浮点型格式输出。例如805.67对应的浮点数为8.056700000000E+02。这种实数表达方式很不方便。我们可以通过下述形式强迫实数以定点型格式输出: 实数表达式:域宽:小数位数例如,t的值设为63.123。下面三条输出语句分别有它们右边所示的输出格式: write(t); 6.312300000000E+01 write(t:6:2); 63.12 write(t:10:5); 63.12300 输出语句的输出格式: 场宽的分类:标准场宽和自定义场宽。 自定义场宽又分为单场宽和双场宽。 单场宽的形式: x:n; 可以输出的项目有整型、字符型、布尔型,不允许实型。 双场宽的形式: x:n1:n2; 控制实型数据的输出。
Slide 83:复合语句:定义:复合语句是由若干条语句组成的语句序列。形式: begin 语句1; 语句2; ···· 语句n end;用保留字begin和end括起来,构成一条逻辑上的语句,语法上充当一条语句。
Slide 9二、 选择结构程序设计 一:什么是选择结构?选择结构的特点? 二:选择结构的几种语句: 1.if 语句:格式:if 条件 then 语句1; if 条件 then 语句1 else 语句2;功能:执行过程说明:1)该语句为一个语句; 2)条件是一个布尔表达式或一个布尔变量,then 和else后的语句可以是单个语句,当需要多条语句时,用begin和end括起来构成复合语句。 3)灵活运用该语句,条件是关键。
Slide 10补充:逻辑运算及布尔表达式 1、布尔常量: true false const t=true;f=false; 2、 布尔变量: var t,f:Boolean; 顺序型数据false(0),true(1),有ord,succ,pred等函数运算 3、关系表达式:定义;运算符;运算结果 对于数值型数据的比较,直接比较数值的大小如:13>6 的结果为true 对于其它类型数据的比较,则按其序号进行比较如:’a’>=’b’的结果为false 逻辑运算:三个运算符(优先级):not(单目) and(双目) or(双目) 运算结果为布尔型数据:true,false 布尔表达式:由逻辑运算符将几个类型相容且有序的表达式联结起来的式子。 逻辑、算术、关系运算符的运算次序:括号——函数、not——*、/、div、mod、and——+、-、or——>、>=、<、<=、=、<> 例:若a=true,b=false,x=7,y=12,m=3,n=35,求下列布尔表达式的值。 a and not (m>n) and (x<y-m) or (a or b) ① ② ③
Slide 112.if 语句的嵌套:格式: (1) if 语句嵌套在then语句中 if 条件1 then if 条件2 then 语句21 else 语句22 else 语句12;(2)if 语句嵌套在else语句中 if 条件1 then 语句11 else if 条件2 then 语句21 else 语句22 ;
Slide 12【例】:计算下列函数 分析:根据输入的x值,先分成x>0与x≤0两种情况,然后对于情况x≤0,再区分x是小于0,还是等于0。
Slide 13程序代码: program ex; var x:real; y:integer; begin write('input x:');readln(x); if x>0 then y:=1 else if x=0 then y:=0 else y:=-1; writeln('x=',x:6:2,'y=',y); end.
Slide 143.case 语句:分情况语句(多分支语句)格式:case 表达式 of 常数表1:语句1; 常数表2:语句2; ···· 常数表n:语句n; else 语句n+1 end; 功能:执行过程说明:1)end 与case 对应 2)表达式的类型通常是整型、字符型 3)常量表是常量,其类型与表达式的类型要一致。常量表中的常量不能重复。
Slide 15【例】:输入两个数(均不为零)及一个算术运算符,输出其运算的结果程序代码: program ex3(input,output); var x,y,s:real; ch:char; begin writeln(‘input x & y & ch:’); readln(x,y); readln(ch); case ch of ‘+’:s:=x+y; ‘-‘:s:=x-y; ‘*’:s:=x*y; ‘/’:s:=x/y end; writeln(x,ch,y,’=’,s) end.
Slide 16上机练习题 1.求一元二次方程ax2+bx+c=0的根。 算法分析:方程的系数a,b,c决定了方程有无根,是几个根,是实数根还是复根。 2.打印某年某月有几天。 算法分析:可分为以下3种情况: 每年的1,3,5,7,8,10,12这七个月每月为31天; 每年的4,6,9,11这四个月为30天; 2月又分为两种情况:闰年为29天,否则为28天。 判断闰年的条件:年数能被4整除,并且不能被100整除,或者年数能被400整除; (year mod 4=0)and (year mod 100<>0) or (year mod 400=0)
Slide 17第三节 循环结构程序设计 一、什么是循环结构?其特点是什么?二、循环结构的三种形式: 1.for语句:(“计数循环”):就是将规定循环体重复执行的次数。格式:for 控制变量:=初值 to 终值 do 循环体语句; for 控制变量:=初值 downto 终值 do 循环体语句;功能:执行过程说明:1) 初值和终值可以是表达式,控制变量和初值、终值的类型相同,且必须是整型、布尔型和字符型等顺序类型,不能为实型。 2)递增按succ函数规律变化,递减按pred函数规律变化,整型按数值大小变化,如果为字符型量,按ASCII码表的顺序计算。 3)初值和终值在循环之前计算,重复过程中,其值不受影响;不得在循环语句中对控制变量进行赋值。 4)当初值超过终值,不执行循环,循环次数为零。
Slide 18【例1】:计算1+2+3+4+···+100之和。算法分析:对于求和,我们使用的是累加的办法。程序代码: program ex1(input,output); var i,sum:integer; begin sum:=0; for i:=1 to 100 do sum:=sum+I; writeln(‘sum=’,sum) end. 补充说明:类似sum迭加变量这样的功能称为“累加器”;类似i这样的变量称为“计数器”;“计数器”和“累加器”是在程序中经常使用的基本操作语句。
Slide 192.while语句:(“当型循环”):当条件满足时反复执行循环体。格式:while 布尔表达式 do 语句;功能:执行过程:先求布尔表达式的值,值为真时,执行语句;值为假时,退出循环。说明:1)为了while循环能正常终止,布尔表达式中的变量必须在循环体中的某语句中有所改变,即有可能是布尔表达式的值为假,使循环结束,否则将出现死循环。 2)循环体中的语句一般是多条语句,用begin和end使其成为一条复合语句。
Slide 20【例】:输出1~100之间的奇数。程序代码: program ex5(input,output); var x:integer; begin x:=1; while x<100 do begin write(x:5); x:=x+2 end end.
Slide 213.until语句:(“直到型循环”):反复执行循环体直到条件满足为止。格式:repeat 语句1; 语句2; 语句3; ··· 语句n until 布尔表达式;功能:执行过程:先执行指定的语句序列,然后判别表达式。
Slide 22说明:while语句和repeat语句都可以实现循环结构,但它们有四点不同:
Slide 23【例】:输出1~100之间的奇数。(用repeat则应该是)程序代码: program ex5(input,output); var x:integer; begin x:=1; repeat write(x:5); x:=x+2 Until x>=100 end.
Slide 24三、多重循环: 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 ………………………………………….. 9*1=9 9*2=18 9*3=27 ………….. …... 9*9=81 打印出如下的九九表:
Slide 25program jjb(input,output); var i,j:integer; begin for i:=1 to 9 do begin for j:=1 to i do write(i,'*',j,'=',i*j,‘ ':3); writeln; end end.
Slide 26四、转向语句:goto Goto语句并不是循环语句,而是一个无条件的强制跳转语句。格式: goto 语句标号; 1、标号说明通常放在程序说明部分第一个出现,格式如下: label 标号1,标号2……… 标号只起到一个表明位置的作用,它并不改变原语句的功能 标号并不代表实际的行数,标号之间也可不按大小顺序 2、只能从一个语句结构中转出来,不允许从外部转进去例如:求100以内的所有质数
Slide 27program js(input,output); Var n,i,j:integer; begin write('2,'); for i:=3 to 100 do begin n:=2; while i mod n<>0 do n:=n+1; if i=n then write(i,','); end; end.
Slide 28上机练习题 1.编程求出1!+2!+3!+……….+n!的值 2.编程找出四位整数abcd中满足下述关系的数。 (ab+cd)(ab+cd)=abcd 3.已知:faibonacci(费波那契)数列的前几个数分别为0,1,1,2,3,5,···,编程求出此数列的前n项。 4.试编写能打印如下输出图形的程序。########### ######### ####### ##### ### #思考:如果把图形上下颠倒的话,程序应如何修改
Slide 295. (1)求出两个自然数a和b的最大公约数。 (2)求出两个自然数a和b的最小公倍数。 6. 用5元钱买100只纽扣,其中金属纽扣每只5角,有机玻璃纽扣每只一角,小按扣1分钱3个,编程求出各种纽扣各买了多少只? 7.(1)随机产生一个三位自然数,判断这个数是否为水仙花数。 (2)求100~999中的水仙花数。(若三位数abc,abc=a3+b3+c3,则称为水仙花数。如:153,13+53+33=1+125+27=153)
Slide 30program jjb(input,output); var i,n,s,m:integer; begin read(n); s:=0; m:=1; for i:=1 to n do begin m:=m*i; s:=s+m; end; writeln('s=',s); end. 1.编程求出1!+2!+3!+……….+n!的值
Slide 312、【算法分析:这道题属于搜索问题,因为是四位整数,其范围从1000——9999,所求的数究竟在哪里,无法确定,只有在这个范围内从小到大一个一个进行搜索,对每一个数,看它的高两位数与低两位数和的平方是否为该数。高两位数:abcd div 100=ab 低两位数:abcd mod 100=cd 程序代码: program ex4(input,output); var i,m,n,k:integer; begin for i:=1000 to 9999 do begin m:=i div 100; n:=i mod 100; k:=(m+n)*(m+N); If k=i then write(I:8) end end. 补充说明:以上用的方法也叫“枚举法”,又称“穷举法”。它是用计算机解题的一种常用的办法。它的基本思路是:一一枚举各种可能的情况,并判断哪一种可能是符合要求的解。方法虽然很笨,然而与计算机高速的处理能力相结合,也不失为一种较有用的方法
Slide 323.已知:faibonacci(费波那契)数列的前几个数分别为0,1,1,2,3,5,···,编程求出此数列的前n项。 program fbnqsl(input,output); var f1,f2,fn,i,n:integer; begin writeln('input n:'); readln(n); f1:=0; f2:=1; write(f1:6,f2:6); for i:=3 to n do begin fn:=f1+f2; write(fn:6); f1:=f2; f2:=fn; end; end.
Slide 334、########### ######### ####### ##### ### # program ex10(input,output); var i,j,k:integer; begin for i:=6 downto 1 do begin for j:=1 to 6-i do write(‘ ‘); for k:=2*i-1 downto 1 do write(‘#’); writeln end end. # ### ##### ####### #################### program ex10(input,output); var i,j,k:integer; begin for i:=1 to 6 do begin for j:=6-i downto 1 do write(' '); for k:=2*i-1 downto 1 do write('#'); writeln end end.
Slide 345、program fbnqsl(input,output); var m,n,t,r:integer; begin writeln('input m and n:'); readln(m,n); if m<n then begin t:=m; n:=m; m:=t; end; r:=m mod n; while r<>0 do begin m:=n; n:=r; r:=m mod n; end; write(n); end. program fbnqsl(input,output); var m,n,i,s:integer; begin writeln('input m and n:'); readln(m,n); i:=1; s:=m*i; while s mod n<>0 do begin i:=i+1; s:=m*i; end; write(s); end. 最小公倍数:
Slide 356、用5元钱买100只纽扣,其中金属纽扣每只5角,有机玻璃纽扣每只一角,小按扣1分钱3个,编程求出各种纽扣各买了多少只? var x,y,z:integer; begin for x:=1 to 10 do for z:=1 to 100 do begin y:=100-x-z; if 50*x+10*y+z/3=500 then writeln(x:4,y:4,z:4); end; end.
Slide 367、program ex9(input,output); var a,b,c:integer; begin for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do if a*a*a+b*b*b+c*c*c=a*100+b*10+c then write(a*100+b*10+c:6); writeln end.
循环结构
by guest102525 | Added: 1 month ago
Language: Chinese | Topic: Nature
4 Views 1 Embeds
Share via email
URL:
Embed: HTML XHTML
For WordPress: Get SlideBoom plugin for WordPress
More by this UserMost ViewedRelated presentations
This user doesn't uploaded any other presenations.
Share via email
(comma-separated)Emails*:
Your name*:
Message:
Refresh
Please enter the characters you see.
Characters are not case sensitive.
Send
* indicates a required field
Share presentation with a group
Group:
Select group
Message:
Post 参考技术A 第一题:
void main()
int n,sum;
n=20;
sum=0;
sum=fun(n);
printf("%ld\n",sum);
return;
long fun(int n)
int i;
long tmp;
i=1;
while(i<=n)
tmp+=i*i;
i++;
return tmp;
第二题:
void main()
int n;
n=1000;
fun(n);
return;
void fun(int n)
int i,sum,tmp;
for(int i=1;i<n;i++) //这里是找1到n之间的水仙数。当然你可以找任意区间的水仙数,只要改变下i的循环数即可。
tmp=i;
sum=0;
while(tmp>0)
sum = sum + (tmp%10)*(tmp%10);
tmp=tmp/10;
if(sum==i)
printf("%d\n",i)
本回答被提问者采纳 参考技术B long fun1()
long sum;
int i;
sum = 0;
for(i=1;i<=20;i++)
sum = sum + i*i;
return sum
void fun2()
int i;
int tmp;
int sum;
for(i=100;i<1000;i++)
tmp=i;
sum=0;
while(tmp>0)
sum = sum + (tmp%10)*(tmp%10);
tmp=tmp/10;
if(sum==i)
printf("%d\n",i)
参考技术C 孩子,作业要自己做!
以上是关于C语言程序6174问题的主要内容,如果未能解决你的问题,请参考以下文章