30
题题 题题题题题题 “题题题题” 题题 “题题题题”题题 题题题题题 题题题题题题 一, 题题题题题题题题 题题题 。: 153 题 “题题题题” 题题 153=1 题题题题5 题题题题3 题题题题 题题题题 题题 for 题题题题 100-999 题题 题题题题题题题题题 题题题 ,,, 题题

* 分解出百位 *

  • Upload
    amelie

  • View
    148

  • Download
    10

Embed Size (px)

DESCRIPTION

题目:打印出所有的 “ 水仙花数 ” ,所谓 “ 水仙花数 ” 是指一个三位数,其各位数字立方和等于该数本身。例如: 153 是一个 “ 水仙花数 ” ,因为 153=1 的三次方+ 5 的三次方+ 3 的三次方。 程序分析:利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。. - PowerPoint PPT Presentation

Citation preview

Page 1: * 分解出百位 *

题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如: 153 是一个“水仙花数”,因为 153=1 的三次方+5 的三次方+ 3 的三次方。

程序分析:利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。

Page 2: * 分解出百位 *

main() { int i,j,k,n; printf("'water flower'number is:");   for(n=100;n<1000;n++)   {    i=n/100;    j=n/10%10;    k=n%10;    if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)         printf("%-5d",n);       } printf("\n"); }

/* 分解出百位 */

/* 分解出十位 */

/* 分解出个位 */

水仙花数的逻辑判断条件

Page 3: * 分解出百位 *

最大数问题:从键盘上任意输入 10 个整数,求出其中的最大数。

算法分析: ( 1 )设第一个数就是最大数 max ; ( 2 )若最大数 max< 下一个数 next ,则该数应为所

输入的所有数中的最大数 (max← next) ,否则最大数保持不变;

( 3 ) n 个数要进行 n-1 次比较

Page 4: * 分解出百位 *

#include “stdio.h”

main()

{int max, next, n;

scanf(“%d”,&next);

max=next;

for (n=2;n<=10; n++)

{scanf(“%d”,&next);

if (next>max) max=next; }

printf(“max=%d\n”, max);

}

/* 第一个数就是最大数 */

/* 输入另外的九个数,并依次比较出最大数 */

/* 打印出最大数 */

Page 5: * 分解出百位 *

问题:求出以“ 9999” 作为结束标志的一组整数的最大数。例如输入: 123 45 5678 34 9999 67 23456 ,输出结果为5678 ,即对 9999 及其以后的数不作处理。

#include “stdio.h”

main()

{int max, next, n;

scanf(“%d”,&next);

max=next;

for ( ; next!=9999; scanf(“%d”,&next) )

{ if (next>max) max=next; }

if (max!=9999) printf(“max=%d\n”, max);

}

/* 第一个数就是最大数 */

Page 6: * 分解出百位 *

问题描述:5位跳水高手参加10米高台跳水决赛,有好事者让5人据实力预测比赛结果.

A选手说:B第二,我第三; B选手说:我第二,E第四; C选手说:我第一,D第二; D选手说:C最后,我第三; E选手说:我第四,A第一. 决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一

错.请编程解出比赛的实际名次.

Bisai.c

Page 7: * 分解出百位 *

#include <iostream.h>void main(){ int cc1,cc2,cc3,cc4,cc5; int A,B,C,D,E; int g; for(A=1; A<=5; A++) for(B=1; B<=5; B++) for(C=1; C<=5; C++) for(D=1; D<=5; D++) for(E=1; E<=5; E++) { cc1=((B==2)&&(!(A==3)))||((!(B==2))&&(A==3)); cc2=((B==2)&&(!(E==4)))||((!(B==2))&&(E==4)); cc3=((C==1)&&(!(D==2)))||((!(C==1))&&(D==2)); cc4=((C==5)&&(!(D==3)))||((!(C==5))&&(D==3)); cc5=((E==4)&&(!(A==1)))||((!(E==4))&&(A==1)); if(((cc1+cc2+cc3+cc4+cc5)==5)&&(A!=B)&&(A!=C)&&(A!=D)&&(A!=E)&&(B!=C)&&(B!=D)&&(B!=E)&&(C!=D)&&(C!=E)&&(D!=E)) { g=1; printf("A %d\n", A); printf("B %d\n", B); printf("C %d\n", C); printf("D %d\n", D); printf("E %d\n", E); }}; if(g!=1) printf("Can't found!\n"); }

/* cc1 到 cc5 代表 5 位选手的逻辑判断 */ /* A , B , C , D , E 分别代表 5 位选手的名次 *//* 问题是否解决的 BOOL 值 */

Page 8: * 分解出百位 *

题目:两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已抽签决定比赛名单。有人向队员打听比赛的名单。 a 说他不和 x 比, c 说他不和 x,z 比,请编程序找出三队赛手的名单。

Page 9: * 分解出百位 *

main() { char i,j,k; for(i='x';i<='z';i++) for(j='x';j<='z';j++) { if(i!=j) for(k='x';k<='z';k++) { if(i!=k&&j!=k) { if(i!='x'&&k!='x'&&k!='z') printf("order is a--%c\tb--%c\tc--%c\n",i,j,k); } } } }

/* i 是 a 的对手, j 是 b 的对手, k 是 c 的对手 */

Page 10: * 分解出百位 *

题目:输入两个正整数 m 和 n ,求其最大公约数和最小公倍数。

程序分析:利用辗除法 GCD(A, B)=GCD(B, A%B) 当 A%B==0 时, B 即为最大公约数 GCD ( 12 , 18 ) =GCD ( 18 , 12 ) =GCD ( 12 , 6 ) =GCD ( 6 , 0 ) 所以 12 和 18 的最大公约数为 6

Page 11: * 分解出百位 *

main() { int a,b,temp; printf("please input two numbers:\n"); scanf("%d,%d",&a,&b); while(b!=0) /* 利用辗除法,直到 b 为 0 为止 */ { temp=a%b; a=b; b=temp; } printf("gongyueshu:%d\n",a); }

问题:若要求两个数的最小公倍数,该如何修改程序?

Page 12: * 分解出百位 *

素数问题:从键盘上任意输入一个十进制整数,判断该数是否是一个素数。若是,则输出“该数是素数”;否则输出“该项数不是素数”。

算法分析: ( 1 )增加标志 flag 。 flag=1 表示是素数, flag=0

表示不是素数。、 ( 2 )一个数只能被 1 和其本身整除,就是素数,因

此需从 2 到 n-1 逐一判断(实际只需要到 n/2 )

Page 13: * 分解出百位 *

#include “stdio.h”

main()

{ int n, i,flag=1;

printf(“ 请输入一个十进制整数” );

scanf(“%d”,&n);

for (i=2;i<n/2; i++)

if (n%i==0) { flag=0; break; }

if (flag==1) printf(“ 该数是素数”) ;

else printf(“ 该数不是素数” );

}

Page 14: * 分解出百位 *

猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

程序分析:采取逆向思维的方法,从后往前推断。

T N=T N-1- ( T N-1 / 2+1 ) T N-1=2*T N + 2

T10=1 (倒推出 T N , N=9 , 8 ,…… 1 )

Page 15: * 分解出百位 *

main() { int day,x1,x2; day=9; x2=1; while(day>0)   {x1=(x2+1)*2;

  x2=x1;   day--;   } printf("the total is %d\n",x1); }

/* 第一天的桃子数是第 2天桃子数加 1 后的 2 倍 */

Page 16: * 分解出百位 *

main() { int day,x=1;

for(day=9;day<=1;day- -)   x=(x+1)*2;

  printf("the total is %d\n",x); }

Page 17: * 分解出百位 *

题目:给一个不多于 5 位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

分析:当 num1!=0 时, 分离个位数 n ,位数 k++,同时 num2=num2*10+

n 丢去 num1 的个位数,并重复以上操作

Page 18: * 分解出百位 *

main()

{long num1, num2=0 ; int k=0, n;

scanf(“%ld”, &num1);

while (num1!=0)

{k++; n=num1%10;

num2=num2*10+n;

num1=num1/10;}

printf(“num1 是一个 %ld 位数 \n”, k);

printf(“num2=%d\n”, num2);

}

num1 为原始数据, num2 为倒序数据,k 为 num1 的位数, n 为 num1 分离出的个位数

/* 定义可处理的数据范围是长整型数 */

Page 19: * 分解出百位 *

题目:一个整数,它加上 100 后是一个完全平方数,再加上 168又是一个完全平方数,请问该数是多少?

程序分析:在 10万以内判断,先将该数加上 100 后再开方,再将该数加上 268 后再开方,如果开方后的结果满足如下条件,即是结果。

Page 20: * 分解出百位 *

#include "math.h" main() { long int i,x,y,z; for (i=1;i<100000;i++)   { x=sqrt(i+100);      y=sqrt(i+268);      if(x*x==i+100&&y*y==i+268)      printf("\n%ld\n",i);   } }

/*x 为加上 100 后开方后的结果 */

/*y 为再加上 168 后开方后的结果 */

/* 如果一个数的平方根的平方等于该数,这说明此数是完全平方数 */

Page 21: * 分解出百位 *

题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。

Page 22: * 分解出百位 *

main() {int a,i,aa[4],t; scanf("%d",&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i<=3;i++)   {aa[i]+=5;   aa[i]%=10;   } for(i=0;i<=3/2;i++)   {t=aa[i];   aa[i]=aa[3-i];   aa[3-i]=t;   } for(i=3;i>=0;i--) printf("%d",aa[i]); }

/* 每位数加 5取余作为加密码*/

/* 1 、 3交换, 2 、 4交换 */

Page 23: * 分解出百位 *

古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

程序分析: 兔子的规律为数列 1,1,2,3,5,8,13,21.... 即从第三项开始,其每一项是前两项之和

Page 24: * 分解出百位 *

main() { long f1,f2; int i; f1=f2=1; for(i=1;i<=20;i++)   { printf("%12ld %12ld",f1,f2);     if(i%2==0) printf("\n");     f1=f1+f2;     f2=f1+f2;   } }

/* 控制输出,每行四个 */

/*前两个月加起来赋值给第三个月 */

/*前两个月加起来赋值给第三个月 */

Page 25: * 分解出百位 *

题目:打印出杨辉三角形(要求打印出 10 行如下图)   

1.程序分析: 1

       1   1        1   2   1        1   3   3   1        1   4  6   4   1        1   5   10   10   5   1  

Page 26: * 分解出百位 *

main() {int i, j, a[10][10]; printf("\n"); for(i=0;i<10;i++)   {a[i][0]=1; a[i][i]=1;} for(i=2;i<10;i++)   for(j=1;j<i;j++)   a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<10;i++)   {for(j=0;j<=i;j++)   printf("%5d",a[i][j]);   printf("\n");   } }

/* 每行的第一和最后一个元素为 1 */

/* 每行中间元素值的确定 */

/* 第 i 行打印 i 个元素 */

Page 27: * 分解出百位 *

冒泡排序法:从键盘上输入一组数,将其按从大到小的顺序输出。

算法描述: ( 1 )每每相邻的两个数比较,使得大数下沉,小数上浮(内循环共进行 n-1 次);

( 2 ) 反复进行以上操作,直到所有的数排序结束(外循环共 n-1轮)

( 3 )若要提高效率,可以改变内循环次或加上标志位的方法

Page 28: * 分解出百位 *

#include “stdio.h”

main()

{ int a[10], i, j, temp;

for (i=0; i<n-1;i++) scanf(“%5d”, a[i]);

for (i=0; i<n-1; i++)

for (j=0; j<n-1; j++)

if (a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1];a[j+1]=temp;}

for (i=0; i<n-1;i++) printf(“%5d”, a[i]);

}

/* 可改为 for(j=0; j<n-1-i; j++) */

Page 29: * 分解出百位 *

设有 N 个人围坐在圆桌周围,从每个位置开始用自然数进行编码为 1 、 2 、 3 、…… N 。然后成编号为 K 的人从 1开始报数,数到 M 的人便出列;下一个人(第 M + 1 个)人由从一开始报数,数到 M 的人便使第二个出列的人。如此下去,直到最后一个人出列为止。要求输出这个序列的顺序。

a[ i ]=1 在位置上a[ i ]=0 不在位置上,已出列sum=0

若 sum==0 一人出列,打印其位置, sum清0

Page 30: * 分解出百位 *

main()

{ int j, k=0,sum=0;

int a[21];

for (i=1;i<21;i++) a[ i ]=1;

while (k<20)

{ for ( j=1; j<21; j++ )

{ sum+=a[ j ];

if (sum==7)

{ printf(“%6d”, j);

a[ j ]=0; sum=0;k++;

}

}

}

}