300 likes | 431 Views
题目:打印出所有的 “ 水仙花数 ” ,所谓 “ 水仙花数 ” 是指一个三位数,其各位数字立方和等于该数本身。例如: 153 是一个 “ 水仙花数 ” ,因为 153=1 的三次方+ 5 的三次方+ 3 的三次方。 程序分析:利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。.
E N D
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 • 程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
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"); } /*分解出百位*/ /*分解出十位*/ /*分解出个位*/ 水仙花数的逻辑判断条件
最大数问题:从键盘上任意输入10个整数,求出其中的最大数。最大数问题:从键盘上任意输入10个整数,求出其中的最大数。 • 算法分析: • (1)设第一个数就是最大数max; • (2)若最大数max<下一个数next,则该数应为所输入的所有数中的最大数(max← next),否则最大数保持不变; • (3)n个数要进行n-1次比较
#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); } /* 第一个数就是最大数 */ /* 输入另外的九个数,并依次比较出最大数 */ /* 打印出最大数 */
问题:求出以“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); } /* 第一个数就是最大数 */
问题描述:5位跳水高手参加10米高台跳水决赛,有好事者让5人据实力预测比赛结果.问题描述:5位跳水高手参加10米高台跳水决赛,有好事者让5人据实力预测比赛结果. • A选手说:B第二,我第三; • B选手说:我第二,E第四; • C选手说:我第一,D第二; • D选手说:C最后,我第三; • E选手说:我第四,A第一. • 决赛成绩公布之后,每位选手的预测都只说对了一半,即一对一错.请编程解出比赛的实际名次.
#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值 */
题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
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的对手 */
题目:输入两个正整数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
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); } 问题:若要求两个数的最小公倍数,该如何修改程序?
素数问题:从键盘上任意输入一个十进制整数,判断该数是否是一个素数。若是,则输出“该数是素数”;否则输出“该项数不是素数”。素数问题:从键盘上任意输入一个十进制整数,判断该数是否是一个素数。若是,则输出“该数是素数”;否则输出“该项数不是素数”。 • 算法分析: • (1)增加标志flag。flag=1表示是素数,flag=0表示不是素数。、 • (2)一个数只能被1和其本身整除,就是素数,因此需从2到n-1逐一判断(实际只需要到n/2)
#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(“该数不是素数”); }
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第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)
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倍*/
main() { int day,x=1; for(day=9;day<=1;day- -) x=(x+1)*2; printf("the total is %d\n",x); }
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 • 分析:当num1!=0时, • 分离个位数n,位数k++,同时num2=num2*10+n • 丢去num1的个位数,并重复以上操作
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分离出的个位数
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? • 程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。
#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后开方后的结果*/ /*如果一个数的平方根的平方等于该数,这说明此数是完全平方数*/
题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。
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交换 */
古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? • 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... • 即从第三项开始,其每一项是前两项之和
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; } } /*控制输出,每行四个*/ /*前两个月加起来赋值给第三个月*/ /*前两个月加起来赋值给第三个月*/
题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析:题目:打印出杨辉三角形(要求打印出10行如下图) 1.程序分析: • 1 1 1 1 2 1 13 31 146 4 1 1510105 1
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个元素 */
冒泡排序法:从键盘上输入一组数,将其按从大到小的顺序输出。冒泡排序法:从键盘上输入一组数,将其按从大到小的顺序输出。 算法描述: (1)每每相邻的两个数比较,使得大数下沉,小数上浮(内循环共进行n-1次); (2) 反复进行以上操作,直到所有的数排序结束(外循环共n-1轮) (3)若要提高效率,可以改变内循环次或加上标志位的方法
#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++) */
设有N个人围坐在圆桌周围,从每个位置开始用自然数进行编码为1、2、3、……N。然后成编号为K的人从1开始报数,数到M的人便出列;下一个人(第M+1个)人由从一开始报数,数到M的人便使第二个出列的人。如此下去,直到最后一个人出列为止。要求输出这个序列的顺序。 a[ i ]=1 在位置上 a[ i ]=0 不在位置上,已出列 sum=0 若sum==0 一人出列,打印其位置,sum清0
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++; } } } }