C语言 c 求输入正整数阶乘一个整数求它有多少个2的因子(例如8有3个2的因子)

当前位置: >>
180多个C语言的编程题1
经典C源程序 100 例 【程序 1】 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三 个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列 1,1,2,3,5,8,13,21.... 2.程序源代码: main() { long f1,f2; 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; /*前两个月加起来赋值给第三个月*/ } } ============================================================== 【程序 2】 题目:判断 101-200 之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整除,则表 明此数不是素数,反之是素数。 2.程序源代码: #i nclude &math.h& main() { int m,i,k,h=0,leap=1; printf(&\n&); for(m=101;m&=200;m++) { k=sqrt(m+1); for(i=2;i&=k;i++) if(m%i==0) {leap=0;} if(leap) {printf(&%-4d&,m);h++; if(h%10==0) printf(&\n&); } leap=1; } printf(&\nThe total is %d&,h); } ============================================================== 【程序 3】 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于 该数本身。例如:153 是一个“水仙花数”,因为 153=1 的三次方+5 的三次方+3 的三次方。 1.程序分析:利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。 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&); } ============================================================== 【程序 4】 题目:将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5。 程序分析:对 n 进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成: (1)如果这个质数恰等于 n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果 n&&k,但 n 能被 k 整除,则应打印出 k 的值,并用 n 除以 k 的商,作为新的正整数你 n,重复执行第一步。 (3)如果 n 不能被 k 整除,则用 k+1 作为 k 的值,重复执行第一步。 2.程序源代码: /* zheng int is divided yinshu*/ main() { int n,i; printf(&\nplease input a number:\n&); scanf(&%d&,&n); printf(&%d=&,n); for(i=2;i&=n;i++) { while(n!=i) { if(n%i==0) { printf(&%d*&,i); n=n/i; } } } printf(&%d&,n);} ============================================================== 【程序 5】 题目:利用条件运算符的嵌套来完成此题:学习成绩&=90 分的同学用 A 表示,60-89 分之 间的用 B 表示,60 分以下的用 C 表示。 1.程序分析:(a&b)?a:b 这是条件运算符的基本例子。 2.程序源代码: main() { printf(&please input a score\n&); scanf(&%d&,&score); grade=score&=90?'A':(score&=60?'B':'C'); printf(&%d belongs to %c&,score,grade); } ============================================================== 【程序 6】 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 2.程序源代码: main() { int a,b,num1,num2, printf(&please input two numbers:\n&); scanf(&%d,%d&,&num1,&num2); if(num1 { temp=num1; num1=num2; num2= } a=num1;b=num2; while(b!=0)/*利用辗除法,直到 b 为 0 为止*/ { temp=a%b; a=b; b= } printf(&gongyueshu:%d\n&,a); printf(&gongbeishu:%d\n&,num1*num2/a); } ============================================================== 【程序 7】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用 while 语句,条件为输入的字符不为'\n'. 2.程序源代码: #i nclude &stdio.h& main() { int letters=0,space=0,digit=0,others=0; printf(&please input some characters\n&); while((c=getchar())!='\n') { if(c&='a'&&c&='z'||c&='A'&&c&='Z') letters++; else if(c==' ') space++; else if(c&='0'&&c&='9') digit++; else others++; } printf(&all in all:char=%d space=%d digit=%d others=%d\n&,letters, space,digit,others); } ============================================================== 【程序 8】 题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。例如 2+22+222+(此 时共有 5 个数相加),几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 2.程序源代码: main() { int a,n,count=1; long int sn=0,tn=0; printf(&please input a and n\n&); scanf(&%d,%d&,&a,&n); printf(&a=%d,n=%d\n&,a,n); while(count&=n) { tn=tn+a; sn=sn+ a=a*10; ++ } printf(&a+aa+...=%ld\n&,sn); } ============================================================== 【程序 9】 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如 6=1+2+3.编程找出 1000 以内的所有完数。 1. 程序分析:请参照程序&--上页程序 14. 2.程序源代码: main() { static int k[10]; int i,j,n,s; for(j=2;j&1000;j++) { n=-1; s=j; for(i=1;i if((j%i)==0) { n++; s=s-i; k[n]=i; } } if(s==0) { printf(&%d is a wanshu&,j); } }} ============================================================== 【程序 10】 题目:一球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第 10 次落地时,共经过多少米?第 10 次反弹多高? 1.程序分析:见下面注释 2.程序源代码: main() { float sn=100.0,hn=sn/2; for(n=2;n&=10;n++) { sn=sn+2*/*第 n 次落地时共经过的米数*/ hn=hn/2; /*第 n 次反跳高度*/ } printf(&the total of road is %f\n&,sn); printf(&the tenth is %f meter\n&,hn); } 【程序 11】 题目:有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是 1、2、3、4。组成所有的排列后再去掉不 满足条件的排列。 2.程序源代码: main() { int i,j,k; printf(&\n&); for(i=1;i&5;i++) for(j=1;j&5;j++) for (k=1;k&5;k++) { if (i!=k&&i!=j&&j!=k) printf(&%d,%d,%d\n&,i,j,k); }} ============================================================== 【程序 12】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于 10 万元时,奖金可提 10%;利润 高于 10 万元,低于 20 万元时,低于 10 万元的部分按 10%提成,高于 10 万元的部分,可 可提成 7.5%;20 万到 40 万之间时,高于 20 万元的部分,可提成 5%;40 万到 60 万之间时 高于 40 万元的部分, 可提成 3%; 60 万到 100 万之间时, 高于 60 万元的部分, 可提成 1.5%, 高于 100 万元时,超过 100 万元的部分按 1%提成,从键盘输入当月利润 I,求应发放奖金 总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: main() { int bonus1,bonus2,bonus4,bonus6,bonus10, scanf(&%ld&,&i); bonus1=.1;bonus2=bonus1+.75; bonus4=bonus2+.5; bonus6=bonus4+.3; bonus10=bonus6+.15; if(i&=100000) bonus=i*0.1; else if(i&=200000) bonus=bonus1+(i-.075; else if(i&=400000) /*确保 i、j、k 三位互不相同*/ /*以下为三重循环*/ bonus=bonus2+(i-.05; else if(i&=600000) bonus=bonus4+(i-.03; else if(i&=1000000) bonus=bonus6+(i-.015; else bonus=bonus10+(i-.01; printf(&bonus=%d&,bonus); } ============================================================== 【程序 13】 题目:一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问 该数是多少?1.程序分析:在 10 万以内判断,先将该数加上 100 后再开方,再将该数加上 268 后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析: 2.程序源代码: #i nclude &math.h& main() { long int i,x,y,z; for (i=1;i&100000;i++) { x=sqrt(i+100); y=sqrt(i+268); 完全平方数*/ printf(&\n%ld\n&,i); }} ============================================================== 【程序 14】 题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几 天,特殊情况,闰年且输入月份大于 3 时需考虑多加一天。 2.程序源代码: main() { int day,month,year,sum, printf(&\nplease input year,month,day\n&); scanf(&%d,%d,%d&,&year,&month,&day); switch(month)/*先计算某月以前月份的总天数*/ /*x 为加上 100 后开方后的结果*/ /*y 为再加上 168 后开方后的结果*/if(x*x==i+100&&y*y==i+268)/*如果一个数的平方根的平方等于该数,这说明此数是 { case 1:sum=0; case 2:sum=31; case 3:sum=59; case 4:sum=90; case 5:sum=120; case 6:sum=151; case 7:sum=181; case 8:sum=212; case 9:sum=243; case 10:sum=273; case 11:sum=304; case 12:sum=334; default:printf(&data error&); } sum=sum+ leap=1; else leap=0; if(leap==1&&month&2)/*如果是闰年且月份大于 2,总天数应该加一天*/ sum++; printf(&It is the %dth day.&,sum);} ============================================================== 【程序 15】 题目:输入三个整数 x,y,z,请把这三个数由小到大输出。 1.程序分析:我们想办法把最小的数放到 x 上,先将 x 与 y 进行比较,如果 x&y 则将 x 与 y 的值进行交换,然后再用 x 与 z 进行比较,如果 x&z 则将 x 与 z 的值进行交换,这样能使 x 最小。 2.程序源代码: main() { int x,y,z,t; scanf(&%d%d%d&,&x,&y,&z); if (x&y) {t=x;x=y;y=t;} /*交换 x,y 的值*/ if(x&z) {t=z;z=x;x=t;}/*交换 x,z 的值*/ /*再加上某天的天数*/ if(year%400==0||(year%4==0&&year%100!=0))/*判断是不是闰年*/ if(y&z) {t=y;y=z;z=t;}/*交换 z,y 的值*/ printf(&small to big: %d %d %d\n&,x,y,z); } 【程序 16】 题目:用*号输出字母 C 的图案。 1.程序分析:可先用'*'号在纸上写出字母 C,再分行输出。 2.程序源代码: #i nclude &stdio.h& main() { printf(&Hello C-world!\n&); printf(& ****\n&); printf(& *\n&); printf(& * \n&); printf(& ****\n&); } ============================================================== 【程序 17】 题目:输出特殊图案,请在 c 环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有 256 个。不同字符,图形不一样。 2.程序源代码: #i nclude &stdio.h& main() { char a=176,b=219; printf(&%c%c%c%c%c\n&,b,a,a,a,b); printf(&%c%c%c%c%c\n&,a,b,a,b,a); printf(&%c%c%c%c%c\n&,a,a,b,a,a); printf(&%c%c%c%c%c\n&,a,b,a,b,a); printf(&%c%c%c%c%c\n&,b,a,a,a,b);} ============================================================== 【程序 18】 题目:输出 9*9 口诀。 1.程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列。 2.程序源代码: #i nclude &stdio.h& main() { int i,j, printf(&\n&); for (i=1;i&10;i++) { for(j=1;j&10;j++) { result=i*j; printf(&%d*%d=%-3d&,i,j,result);/*-3d 表示左对齐,占 3 位*/ } printf(&\n&);/*每一行后换行*/ } } ============================================================== 【程序 19】 题目:要求输出国际象棋棋盘。 1.程序分析:用 i 控制行,j 来控制列,根据 i+j 的和的变化来控制输出黑方格,还是白方格。 2.程序源代码: #i nclude &stdio.h& main() { int i,j; for(i=0;i&8;i++) { for(j=0;j&8;j++) if((i+j)%2==0) printf(&%c%c&,219,219); else printf(& &); printf(&\n&); } } ============================================================== 【程序 20】 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 1.程序分析:用 i 控制行,j 来控制列,j 根据 i 的变化来控制输出黑方格的个数。 2.程序源代码: #i nclude &stdio.h& main() { int i,j; printf(&\1\1\n&);/*输出两个笑脸*/ for(i=1;i&11;i++) { for(j=1;j&=i;j++) printf(&%c%c&,219,219); printf(&\n&); } } 【程序 21】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半, 又多吃了一个。 以后每天早上都吃了前一天剩下的一 半零一个。到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 1.程序分析:采取逆向思维的方法,从后往前推断。 2.程序源代码: main() { int day,x1,x2; day=9; x2=1; while(day&0) {x1=(x2+1)*2;/*第一天的桃子数是第 2 天桃子数加 1 后的 2 倍*/ x2=x1; day--; } printf(&the total is %d\n&,x1); } ============================================================== 【程序 22】 题目:两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已抽签决 定比赛名单。有人向队员打听比赛的名单。a 说他不和 x 比,c 说他不和 x,z 比,请编程序 找出三队赛手的名单。 1.程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整除,则表 明此数不是素数,反之是素数。 2.程序源代码: main() { char i,j,k;/*i 是 a 的对手,j 是 b 的对手,k 是 c 的对手*/ 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); }}}} ============================================================== 【程序 23】 题目:打印出如下图案(菱形) * *** ***** ******* ***** *** * 1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for 循环,第一层控制行,第二层控制列。 2.程序源代码: main() { int i,j,k; for(i=0;i&=3;i++) { for(j=0;j&=2-i;j++) printf(& &); for(k=0;k&=2*i;k++) printf(&*&); printf(&\n&); } for(i=0;i&=2;i++) { for(j=0;j&=i;j++) printf(& &); for(k=0;k&=4-2*i;k++) printf(&*&); printf(&\n&); } } ============================================================== 【程序 24】 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项之和。 1.程序分析:请抓住分子与分母的变化规律。 2.程序源代码: main() { int n,t,number=20; float a=2,b=1,s=0; for(n=1;n&=n++) { s=s+a/b; t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜 t 的作用*/ } printf(&sum is %9.6f\n&,s); } ============================================================== 【程序 25】 题目:求 1+2!+3!+...+20!的和 1.程序分析:此程序只是把累加变成了累乘。 2.程序源代码: main() { float n,s=0,t=1; for(n=1;n&=20;n++) { t*=n; s+=t; } printf(&1+2!+3!...+20!=%e\n&,s); } ============================================================== 【程序 26】 题目:利用递归方法求 5!。 1.程序分析:递归公式:fn=fn_1*4! 2.程序源代码: #i nclude &stdio.h& main() { int fact(); for(i=0;i&5;i++) printf(&\40:%d!=%d\n&,i,fact(i)); } int fact(j) { if(j==0) sum=1; else sum=j*fact(j-1); } ============================================================== 【程序 27】 题目:利用递归函数调用方式,将所输入的 5 个字符,以相反顺序打印出来。 1.程序分析: 2.程序源代码: #i nclude &stdio.h& main() { int i=5; void palin(int n); printf(&\40:&); palin(i); printf(&\n&); } void palin(n) {
if(n&=1) { next=getchar(); printf(&\n\0:&); putchar(next); } else { next=getchar(); palin(n-1); putchar(next); } } ============================================================== 【程序 28】 题目:有 5 个人坐在一起,问第五个人多少岁?他说比第 4 个人大 2 岁。问第 4 个人岁数, 他说比第 3 个人大 2 岁。问第三个人,又说比第 2 人大两岁。问第 2 个人,说比第一个人大 两岁。最后问第一个人,他说是 10 岁。请问第五个人多大? 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需 知道第四人的岁数,依次类推,推到第一人(10 岁),再往回推。 2.程序源代码: age(n) { if(n==1) c=10; else c=age(n-1)+2; return(c); } main() { printf(&%d&,age(5)); } ============================================================== 【程序 29】 题目:给一个不多于 5 位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 1. 程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法,师专数 002 班赵 鑫提供) 2.程序源代码: main( ) { long a,b,c,d,e,x; scanf(&%ld&,&x); a=x/10000;/*分解出万位*/ b=x%;/*分解出千位*/ c=x%;/*分解出百位*/ d=x%100/10;/*分解出十位*/ e=x%10;/*分解出个位*/ if (a!=0) printf(&there are 5, %ld %ld %ld %ld %ld\n&,e,d,c,b,a); else if (b!=0) printf(&there are 4, %ld %ld %ld %ld\n&,e,d,c,b); else if (c!=0) printf(& there are 3,%ld %ld %ld\n&,e,d,c); else if (d!=0) printf(&there are 2, %ld %ld\n&,e,d); else if (e!=0) printf(& there are 1,%ld\n&,e); } ============================================================== 【程序 30】 题目:一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千 位相同。 1.程序分析:同 29 例 2.程序源代码: main( ) { long ge,shi,qian,wan,x; scanf(&%ld&,&x); wan=x/10000; qian=x%; shi=x%100/10; ge=x%10; if (ge==wan&&shi==qian)/*个位等于万位并且十位等于千位*/ printf(&this number is a huiwen\n&); else printf(&this number is not a huiwen\n&); } 【程序 31】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断 第二个字母。 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或 if 语句判断第 二个字母。 2.程序源代码: #i nclude void main() { printf(&please input the first letter of someday\n&); while ((letter=getch())!='Y')/*当所按字母为 Y 时才结束*/ { switch (letter) {case 'S':printf(&please input second letter\n&); if((letter=getch())=='a') printf(&saturday\n&); else if ((letter=getch())=='u') printf(&sunday\n&); else printf(&data error\n&); case 'F':printf(&friday\n&); case 'M':printf(&monday\n&); case 'T':printf(&please input second letter\n&); if((letter=getch())=='u') printf(&tuesday\n&); else if ((letter=getch())=='h') printf(&thursday\n&); else printf(&data error\n&); case 'W':printf(&wednesday\n&); default: printf(&data error\n&); }}} ============================================================== 【程序 32】 题目:Press any key to change color, do you want to try it. Please hurry up! 1.程序分析: 2.程序源代码: #i nclude void main(void) { for (color = 0; color & 8; color++) { textbackground(color);/*设置文本的背景颜色*/ cprintf(&This is color %d\r\n&, color); cprintf(&Press any key to continue\r\n&); getch();/*输入字符看不见*/ }} ============================================================== 【程序 33】 题目:学习 gotoxy()与 clrscr()函数 1.程序分析: 2.程序源代码: #i nclude void main(void) { clrscr();/*清屏函数*/ textbackground(2); gotoxy(1, 5);/*定位函数*/ cprintf(&Output at row 5 column 1\n&); textbackground(3); gotoxy(20, 10); cprintf(&Output at row 10 column 20\n&); } ============================================================== 【程序 34】 题目:练习函数调用 1. 程序分析: 2.程序源代码: #i nclude void hello_world(void) { printf(&Hello, world!\n&); } void three_hellos(void) { for (counter = 1; counter &= 3; counter++) hello_world();/*调用此函数*/ } void main(void) { three_hellos();/*调用此函数*/ } ============================================================== 【程序 35】 题目:文本颜色设置 1.程序分析: 2.程序源代码: #i nclude void main(void) { for (color = 1; color & 16; color++) { textcolor(color);/*设置文本颜色*/ cprintf(&This is color %d\r\n&, color); } textcolor(128 + 15); cprintf(&This is blinking\r\n&); } ============================================================== 【程序 36】 题目:求 100 之内的素数 1.程序分析: 2.程序源代码: #i nclude #i nclude &math.h& #define N 101 main() { int i,j,line,a[N]; for(i=2;ifor(i=2;i&SQRT(N);I++) for(j=i+1;j&N;J++) { if(a!=0&&a[j]!=0) if(a[j]%a==0) a[j]=0;} printf(&\n&); for(i=2,line=0;i&N;I++) { if(a!=0) {printf(&%5d&,a); line++;} if(line==10) {printf(&\n&); line=0;} }} ============================================================== 【程序 37】 题目:对 10 个数进行排序 1.程序分析: 可以利用选择法, 即从后 9 个比较过程中, 选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后 8 个进行比较,并进行交换。 2.程序源代码: #define N 10 main() {int i,j,min,tem,a[N]; /*input data*/ printf(&please input ten num:\n&); for(i=0;i&N;I++) { printf(&a[%d]=&,i); scanf(&%d&,&a);} printf(&\n&); for(i=0;i&N;I++) printf(&%5d&,a); printf(&\n&); /*sort ten num*/ for(i=0;i&N-1;I++) {min=i; for(j=i+1;j&N;J++) if(a[min]&a[j]) min=j; tem=a; a=a[min]; a[min]= } /*output data*/ printf(&After sorted \n&); for(i=0;i&N;I++) printf(&%5d&,a); } ============================================================== 【程序 38】 题目:求一个 3*3 矩阵对角线元素之和 1.程序分析:利用双重 for 循环控制输入二维数组,再将 a 累加后输出。 2.程序源代码: main() { float a[3][3],sum=0; int i,j; printf(&please input rectangle element:\n&); for(i=0;i&3;i++) for(j=0;j&3;j++) scanf(&%f&,&a[j]); for(i=0;i&3;i++) sum=sum+a; printf(&duijiaoxian he is %6.2f&,sum); } ============================================================== 【程序 39】 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。 1. 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入 后此元素之后的数,依次后移一个位置。 2.程序源代码: main() { int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j; printf(&original array is:\n&); for(i=0;i&10;i++) printf(&%5d&,a); printf(&\n&); printf(&insert a new number:&); scanf(&%d&,&number); end=a[9]; if(number&end) a[10]= else {for(i=0;i&10;i++) { if(a&number) {temp1=a; a= for(j=i+1;j&11;j++) {temp2=a[j]; a[j]=temp1; temp1=temp2; } } } } for(i=0;i&11;i++) printf(&%6d&,a); } ============================================================== 【程序 40】 题目:将一个数组逆序输出。 1.程序分析:用第一个与最后一个交换。 2.程序源代码: #define N 5 main() { int a[N]={9,6,5,4,1},i, printf(&\n original array:\n&); for(i=0;i&N;I++) printf(&%4d&,a); for(i=0;i {temp=a; a=a[N-i-1]; a[N-i-1]= } printf(&\n sorted array:\n&); for(i=0;i&N;I++) printf(&%4d&,a); } ==============================================================【【程序 61】 题目:打印出杨辉三角形(要求打印出 10 行如下图) 1.程序分析: 1 1 1 1 1 1 2.程序源代码: main() {int i,j; int 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&); }} ============================================================== 【程序 66】 题目:输入 3 个数 a,b,c,按大小顺序输出。 1.程序分析:利用指针方法。 2.程序源代码: /*pointer*/ main() { int n1,n2,n3; int *pointer1,*pointer2,*pointer3; 1 2 3 4 5 1 3 6 10 1 4 10 1 5 1 printf(&please input 3 number:n1,n2,n3:&); scanf(&%d,%d,%d&,&n1,&n2,&n3); pointer1=&n1; pointer2=&n2; pointer3=&n3; if(n1&n2) swap(pointer1,pointer2); if(n1&n3) swap(pointer1,pointer3); if(n2&n3) swap(pointer2,pointer3); printf(&the sorted numbers are:%d,%d,%d\n&,n1,n2,n3); } swap(p1,p2) int *p1,*p2; { p=*p1;*p1=*p2;*p2=p; } ============================================================== 【程序 67】 题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。 1.程序分析:谭浩强的书中答案有问题。 2.程序源代码: main() { int number[10]; input(number); max_min(number); output(number); } input(number) int number[10]; { for(i=0;i&9;i++) scanf(&%d,&,&number); scanf(&%d&,&number[9]); } max_min(array) int array[10]; {int *max,*min,k,l; int *p,*arr_ arr_end=array+10; max=min= for(p=array+1;p&ARR_END;P++) if(*p&*max) max=p; else if(*p&*min) min=p; k=* l=* *p=array[0];array[0]=l;l=*p; *p=array[9];array[9]=k;k=*p; } output(array) int array[10]; { int *p; for(p=p&ARRAY+9;P++) printf(&%d,&,*p); printf(&%d\n&,array[9]); } ============================================================== 【程序 68】 题目:有 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数 1.程序分析: 2.程序源代码: main() { int number[20],n,m,i; printf(&the total numbers is:&); scanf(&%d&,&n); printf(&back m:&); scanf(&%d&,&m); for(i=0;i&N-1;I++) scanf(&%d,&,&number); scanf(&%d&,&number[n-1]); move(number,n,m); for(i=0;i&N-1;I++) printf(&%d,&,number); printf(&%d&,number[n-1]); } move(array,n,m) int n,m,array[20]; { int *p,array_ array_end=*(array+n-1); for(p=array+n-1;p&p--) *p=*(p-1); *array=array_ m--; if(m&0) move(array,n,m); } ============================================================== 【程序 69】 题目:有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子,问最后留下的是原来第几号的那位。 1. 程序分析: 2.程序源代码: #define nmax 50 main() { int i,k,m,n,num[nmax],*p; printf(&please input the total of numbers:&); scanf(&%d&,&n); p= for(i=0;i&N;I++) *(p+i)=i+1; i=0; k=0; m=0; while(m&N-1) { if(*(p+i)!=0) k++; if(k==3) { *(p+i)=0; k=0; m++; } i++; if(i==n) i=0; } while(*p==0) p++; printf(&%d is left\n&,*p); } ============================================================== 【程序 70】 题目:写一个函数,求一个字符串的长度,在 main 函数中输入字符串,并输出其长度。 1.程序分析: 2.程序源代码: main() { char *str[20]; printf(&please input a string:\n&); scanf(&%s&,str); len=length(str); printf(&the string has %d characters.&,len); } length(p) char *p; { n=0; while(*p!='\0') { n++;p++; } } 【程序 71】 题目:编写 input()和 output()函数输入,输出 5 个学生的数据记录。 1.程序分析: 2.程序源代码: #define N 5 struct student { char num[6]; char name[8]; int score[4]; } stu[N]; input(stu) struct student stu[]; { int i,j; for(i=0;i&N;I++) { printf(&\n please input %d of %d\n&,i+1,N); printf(&num: &); scanf(&%s&,stu.num); printf(&name: &); scanf(&%s&,stu.name); for(j=0;j&3;j++) { printf(&score %d.&,j+1); scanf(&%d&,&stu.score[j]); } printf(&\n&); } } print(stu) struct student stu[]; { int i,j; printf(&\nNo. Name Sco1 Sco2 Sco3\n&); for(i=0;i&N;I++) { printf(&%-6s%-10s&,stu.num,stu.name); for(j=0;j&3;j++) printf(&%-8d&,stu.score[j]); printf(&\n&); }} main() { input(); print(); } ============================================================== 【程序 75】 题目:放松一下,算一道简单的题目。 1.程序分析: 2.程序源代码: main() { int i,n; for(i=1;i&5;i++) { n=0; if(i!=1) n=n+1; if(i==3) n=n+1; if(i==4) n=n+1; if(i!=4) n=n+1; if(n==3) printf(&zhu hao shi de shi:%c&,64+i); } } ============================================================== 【程序 76】 题目:编写一个函数,输入 n 为偶数时,调用函数求 1/2+1/4+...+1/n,当输入 n 为奇数时,调 用函数 1/1+1/3+...+1/n(利用指针函数) 1.程序分析: 2.程序源代码: main() #include &stdio.h& main() { float peven(),podd(),dcall(); while (1) { scanf(&%d&,&n); if(n&1) } if(n%2==0) { printf(&Even=&); sum=dcall(peven,n); } else { printf(&Odd=&); sum=dcall(podd,n); } printf(&%f&,sum); } float peven(int n) { s=1; for(i=2;i&=n;i+=2) s+=1/(float)i; return(s); } float podd(n) { s=0; for(i=1;i&=n;i+=2) s+=1/(float)i; return(s); } float dcall(fp,n) float (*fp)(); { s=(*fp)(n); return(s); } ============================================================== 【程序 78】 题目:找到年龄最大的人,并输出。请找出程序中有什么问题。 1.程序分析: 2.程序源代码: #define N 4 #include &stdio.h& static struct man { char name[20]; } person[N]={&li&,18,&wang&,19,&zhang&,20,&sun&,22}; main() {struct man *q,*p; int i,m=0; p= for (i=0;i&N;I++) {if(mage) q=p++; m=q-&} printf(&%s,%d&,(*q).name,(*q).age); } ============================================================== 【程序 79】 题目:字符串排序。 1.程序分析: 2.程序源代码: main() { char *str1[20],*str2[20],*str3[20]; char swap(); printf(&please input three strings\n&); scanf(&%s&,str1); scanf(&%s&,str2); scanf(&%s&,str3); if(strcmp(str1,str2)&0) swap(str1,str2); if(strcmp(str1,str3)&0) swap(str1,str3); if(strcmp(str2,str3)&0) swap(str2,str3); printf(&after being sorted\n&); printf(&%s\n%s\n%s\n&,str1,str2,str3); } char swap(p1,p2) char *p1,*p2; { char *p[20]; strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p); } ============================================================== 【程序 80】 题目: 海滩上有一堆桃子, 五只猴子来分。 第一只猴子把这堆桃子凭据分为五份, 多了一个, 这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又 多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做 的,问海滩上原来最少有多少个桃子? 1.程序分析: 2.程序源代码: main() {int i,m,j,k, for(i=4;i&10000;i+=4) { count=0; m=i; for(k=0;k&5;k++) { j=i/4*5+1; i=j; if(j%4==0) count++; } i=m; if(count==4) {printf(&%d\n&,count);} } } 【程序 81】 题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为 3 位数。求??代表的两位数,及 809*??后的结果。 1.程序分析: 2.程序源代码: output(long b,long i) { printf(&\n%ld/%ld=809*%ld+%ld&,b,i,i,b%i); } main() {long int a,b,i; a=809; for(i=10;i&100;i++) {b=i*a+1; if(b&=1000&&b&=10000&&8*i&100&&9*i&=100) output(b,i); } } ============================================================== 【程序 83】 题目:求 0―7 所能组成的奇数个数。 1.程序分析: 2.程序源代码: main() { long sum=4,s=4; for(j=2;j&=8;j++)/*j is place of number*/ { printf(&\n%ld&,sum); if(j&=2) s*=7; else s*=8; sum+=s;} printf(&\nsum=%ld&,sum); } ============================================================== 【程序 84】 题目:一个偶数总能表示为两个素数之和。 1.程序分析: 2.程序源代码: #include &stdio.h& #include &math.h& main() { int a,b,c,d; scanf(&%d&,&a); for(b=3;b&=a/2;b+=2) { for(c=2;c&=sqrt(b);c++) if(b%c==0) if(c&sqrt(b)) d=a-b; for(c=2;c&=sqrt(d);c++) if(d%c==0) if(c&sqrt(d)) printf(&%d=%d+%d\n&,a,b,d); } } ============================================================== 【程序 85】 题目:判断一个素数能被几个 9 整除 1.程序分析: 2.程序源代码: main() { long int m9=9,sum=9; int zi,n1=1,c9=1; scanf(&%d&,&zi); while(n1!=0) { if(!(sum%zi)) n1=0; else {m9=m9*10; sum=sum+m9; c9++; } } printf(&%ld,can be divided by %d \&9\&&,sum,c9); } ============================================================== 【程序 86】 题目:两个字符串连接程序 1.程序分析: 2.程序源代码: #include &stdio.h& main() {char a[]=&acegikm&; char b[]=&bdfhjlnpq&; char c[80],*p; int i=0,j=0,k=0; while(a!='\0'&&b[j]!='\0') {if (a { c[k]=a;i++;} else c[k]=b[j++]; k++; } c[k]='\0'; if(a=='\0') p=b+j; else p=a+i; strcat(c,p); puts(c); } ============================================================== 【程序 88】 题目:读取 7 个数(1―50)的整数值,每读取一个值,程序打印出该值个数的*。 1.程序分析: 2.程序源代码: main() {int i,a,n=1; while(n&=7) { do { scanf(&%d&,&a); }while(a&1||a&50); for(i=1;i&=a;i++) printf(&*&); printf(&\n&); n++;} getch(); } ============================================================== 【程序 89】 题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密 规则如下:每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交 换,第二位和第三位交换。 1.程序分析: 2.程序源代码: main() {int a,i,aa[4],t; scanf(&%d&,&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%; aa[3]=a/1000; for(i=0;i&=3;i++) {aa+=5; aa%=10; } for(i=0;i&=3/2;i++) {t= aa=aa[3-i]; aa[3-i]=t; } for(i=3;i&=0;i--) printf(&%d&,aa); } ============================================================== 【程序 90】 题目:专升本一题,读结果。 1.程序分析: 2.程序源代码: #include &stdio.h& #define M 5 main() {int a[M]={1,2,3,4,5}; int i,j,t; i=0;j=M-1; while(i {t=*(a+i); *(a+i)=*(a+j); *(a+j)=t; i++;j--; } for(i=0;i printf(&%d&,*(a+i)); } 【程序 96】 题目:计算字符串中子串出现的次数 1.程序分析: 2.程序源代码: #include &string.h& #include &stdio.h& main() { char str1[20],str2[20],*p1,*p2; int sum=0; printf(&please input two strings\n&); scanf(&%s%s&,str1,str2); p1=str1;p2=str2; while(*p1!='\0') { if(*p1==*p2) {while(*p1==*p2&&*p2!='\0') {p1++; p2++;} } else p1++; if(*p2=='\0') sum++; p2=str2; } printf(&%d&,sum); getch();} 一、单一符号图形 1、基本的几何图形 一些复杂的图形通常会由几种最基本的图形组合而成,掌握简单的几何图形的编程方法, 就给复杂的图形的编程打下良好的基础。 典型的使用两重循环完成基本的几何图形的程序为: 这里面有三个打印语句,这一个确认每行第一个字符的打印位置;第二个确定打印的字 符;第三个的作用是换行。 在下面的各个图形中,上面程序的 n 的值都是 4,打印的内容 c 都是“*”,分析它们各 个的打印位置 a 和每行列数 b 各有什么不同。***** ***** ***** ***** (1) **** *** ** * (6) **** *** ** * (7) ***** ***** ***** ***** (2) * *** ***** ******* (8) ***** ***** ***** **** (3) *** ***** ******* ********* (9) * ** *** **** (4) * ** *** **** (5) ******* ***** *** * (10)2、对称图形 打印较复杂的对称图形,一般有下面几种方法: (1)、组合拼接法 即将一个较复杂的图形,看成由两个或几个简单的几何图形拼接而成,这时只需要分别 打印各简单图形的程序连接在一起就可以了。例:给出边长 N ,打印出菱形 分析:由右图可以看出,边长为 N 的实心菱形的上半部分是个 N 行的正立的等 腰三角形,下半部分是个 N-1 行的倒置等腰三角形。关键问题上下两部分每行的第 一个字符的位置要找准。 源程序:略。 * *** ***** ******* ***** *** *(2)、中间变量法 利用与循环变量的值的关系的另外的变量,结合条件语句,来解决分别打印对称图形的 上、下两部分或一行字符中的左、右两部分的对称问题,是中间变量法要解决的主要问题。例:给出边长 N ,打印出菱形 分析:由右图可以看出,菱形可以看成以横轴对称的两个相等的三角形,我们可以 利用它的对称性, 整体打印这个菱形。 用循环变量 I 控制行数从 1 到 2*N-1 通过条 件语句判断当前行是在上半部还是在下半部再分别处理。 源程序:略。 * *** ***** ******* ***** *** *(3)、循环变量对称法 这种方法让循环变量由初值 -K 到终值 K (初值与终值的绝对值相同),循环变量的绝对 值以 0 为原点对称分布,这种安排对应的图形的对称或每行打印内容对称。例:给出边长 N ,打印出菱形 分析:从右图可以看出,菱形可以看成以横轴对称的两个相等的三角形,我们可以 利用对称行与对称轴的距离相同的性质,将水平方向的对称轴定为 0 行,上边的为 行数与每边字符个数的关系为 N-1。 源程序:略。 * *** ***** ***** *** *正行数,下边为负行数,行数的绝对值即可以看成各行与对称轴的距离,对称轴上下 * * * * * * *(4)、子字符串截取法 这种方法利用取子字符串函数来截取源字符串的方式来做文本图形。这种方法可以省掉 内循环,尤其适用于打印不易找到数学规律的字符或数字内容,更有它的优越性。 以上四种方法,并不都是彼此独立的,可以根据图形的具体特点相互结合灵活使用。 3、空心图形 以上我们所打印的都是实心的文本图形,如果空心的图形如何处理呢?这里介绍两种方 法。 (1)、利用打印格式函数 TAB(x) 把图形空缺的两边的字符分成左右两部分,利用打印格式函数 TAB(x)分别定出每一部分 字符的位置。 (2)、利用打印空格函数 SPC(x) 使用空格函数来解决打印具有空缺图形的优点是:可以不考虑右半部图形的第一个字符 的具体位置,把空格也当作图形的一部分连续打印。 4、连续图形 (1)、二方连续文本图形 将一个基本几何图形沿左右方向重复连续地显示出来,叫做二方连续的图形。我们知道, 文本图形输出时,每一行只能从左往右打印,并逐行由上而下输出。为了解决这个问题,所 以控制并列打印几个重复图形的循环语句应加在控制每个图形行数的外循环与控制每个图 形每行字符个数的内循环之间。 控制每个图形每行第一个字符打印位置的方法有两种: 方法一:用 TAB 函数控制第一个图形每行第一个字符的位置,用 SPC 函数控制每个图形每 行之间的空格数。 方法二:用 TAB 函数控制各个图形之的每一行的第一个字符的位置。 (2)、四方连续文本图形 将一个基本几何图形按上下左右连续重复组成的一个图形叫四方连续文本图形。 这个图形的 打印比较简单, 只需要在前面所说的二方连续文本图形的基础上, 在最外面加上一层控制图 形层数的循环就可以了。 二、有规律的数字图形 在字符图形中有些图形不是由单一的字符组成, 而是由一些有规律变化的字符组成的, 打印 这些图形除了要找出形状的变化规律外, 还要找到字符的变化规律与图形形状变化之间的联 系,有时还要注意字符变化可能给图形变化带来的影响。 1、注意数字与字符的区别例:打印如下图形(见图 1 ) 分析:一般都会认为程序的设计与单一字符图形时是一样的,只 1 222 1 2 2 2 3 3 3 3 3 4 4 4 4 4 4 4 图 2需要把“*”号换成循环变量 I 就可以了,但结果打印出来的样式 33333 就变成了图 2 的形状了。 原因就是在 BASIC 语言里数值变量的 4444444 前后都会有一个空格输出。为此,必须加上一个格式控制语句: 图 1 USING&#&,以使数字可以连续输出。2、注意字符变化可能带来的影响例:打印如下图形 分析:图中的字符有一位数也有两位数,如果还是用前面的方法,那么就 会出现有部分数字挤在一起。如果我们碰到了这种情况,即数字符号位数 不同时,要将控制打印位置的语句与打印字符语句放在一起。对每个打印 符号都要定位后再打印。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25三、有规律的字符图形 符号图形不光可以由有规律的数字组成,还可以由有规律变化的字符组成。例:打印如下图形(图 1) 分析:这一类图形可以我们仿效有规律的数字图形一样去 A AB 65
6676869 图 2 1 12 123
图 3编程,如果把图 1 中的字母转换成 ASCⅡ码图形,则会变 ABC 成图 2 的样子,如果再把图 2 中每个 ASCⅡ码都减去 64 ABCD 就会得到图 3 的图形,那么这个图形我们已经会了。问题 ABCDE 也就解决了。 图 1四、特殊文本图形 有些数字阵列我们称为特殊文本图形。如拉丁方阵、螺旋方阵、杨辉三角形等。 1、螺旋方阵例:打印 N×N 螺旋方阵(图 1,N=5)。 的左上角按顺时间方向排列的一组自然 1 2 3 4 5 15 24 25 20 7 13 12 11 10 9 图 1 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 图 2 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 图 3 分析:螺旋方阵是从数字 1 开始,人雠阵 16 17 18 19 6 数。有序数字的排列方向有时按行,有时 14 23 22 21 8按列,而显示方式只能按行,因此我们分析一下数字与所在行和行上位置(列)的关系。用一 个二维数组来储存这个图形:A(1,1)=1,A(1,2)=2,A(1,3)=3,A(1,4)=4,A(1,5)=5,A(2,5)=6, A(3,5)=7……,可以发现数组下标先是行下标不变,再是列下标不变,然后又是行下标不 变……,对于最外边一圈数字,我们可以按同行不同列或同列不同行将它们分成四块,如图 2 , 每块长度为 K=N-1。 第一圈赋值完了以后, 按刚才的方法把第二圈也分成四块, 如图 3 , 这时块的长度应该减 2 ,相应的行列位置应有加有减。然后再做第三圈……一直到 K&=0, 此时如果 K&0,则剩下中心一个数字,那么就可以直接赋值;如果 K=0,则刚好完成所有 数字的赋值。这时只需要把这个二维数组输出即可。 2、杨辉三角形例:打印 N 层“杨辉三角形”。(N=5) 分析:杨辉三角形的每一行是(a+b) 展开式的各项系数。观察一下右图,你n1 1 1 1 1 3 1 1 5 4 6 2 1 3 1 4 1 1 10 10 5会发现任一元素都等于它上一行相邻两元素之和,利用这一规律我们可以 用二维数组 A(N,N)按行存放产生的所有元素,这个三角形的行数和列数的 变化是每行列数等于所在的行数,打印时使隔行元素在同一列上即可。练习: 1、编程输出下列图形:(1)图中 N=5 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 (2) ********* ******* ***** *** (3) ******* * * * * * * * * (4)N=5(N&=5) 1 232 4 ************** 2、数字螺旋问题:对任给的自然数 N,从 1 开始由中间向下,再按逆时针方向向外 转出,直至旋到 N 为止(如右图,图中 N=11)。打印时要求数字按列左边对齐。 7 6 5 8 1 4 9 2 3 10 11 3、打印数字三角形。根据键盘输入的 N 值(N&20),在屏幕上输出相应的数字三 角形(如右图,图中 N=5)。 1 12 2 11 13 3 10 15 14 4 9 8 【程序 97】 题目:有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都是 1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int i,j,k; 7 6 5 printf(&\n&); for(i=1;i&5;i++) /*以下为三重循环*/ for(j=1;j&5;j++) for (k=1;k&5;k++) { if (i!=k&&i!=j&&j!=k) /*确保 i、j、k 三位互不相同*/ printf(&%d,%d,%d\n&,i,j,k); } getch(); } =========================================== 【程序 98】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于 10 万元时,奖金可提 10%;利润高 于 10 万元,低于 20 万元时,低于 10 万元的部分按 10%提成,高于 10 万元的部分,可可提 成 7.5%;20 万到 40 万之间时,高于 20 万元的部分,可提成 5%;40 万到 60 万之间时高于 40 万元的部分,可提成 3%;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5%,高于 100 万元时,超过 100 万元的部分按 1%提成,从键盘输入当月利润 I,求应发放奖金总数? 1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int bonus1,bonus2,bonus4,bonus6,bonus10, scanf(&%ld&,&i); bonus1=. 1; bonus2=bonus1+.75; bonus4=bonus2+.5; bonus6=bonus4+.3; bonus10=bonus6+.15; if(i&=100000) bonus=i*0.1; else if(i&=200000) bonus=bonus1+(i-.075; else if(i&=400000) bonus=bonus2+(i-.05; else if(i&=600000) bonus=bonus4+(i-.03; else if(i&=1000000) bonus=bonus6+(i-.015; else bonus=bonus10+(i-.01; printf(&bonus=%d&,bonus); getch(); } =========================================== 【程序 99】 题目:一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少? 1.程序分析:在 10 万以内判断,先将该数加上 100 后再开方,再将该数加上 268 后再开方,如果开方后 的结果满足如下条件,即是结果。请看具体分析: 2.程序源代码: #include &math.h& #include &stdio.h& #include &conio.h& main() { long int i,x,y,z; for (i=1;i&100000;i++) { x=sqrt(i+100); /*x 为加上 100 后开方后的结果*/ y=sqrt(i+268); /*y 为再加上 168 后开方后的结果*/ */ if(x*x==i+100&&y*y==i+268) /*如果一个数的平方根的平方等于该数,这说明此数是完全平方数 printf(&\n%ld\n&,i); } getch(); } =========================================== 【程序 100】 题目:输入某年某月某日,判断这一天是这一年的第几天? 1.程序分析:以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几天,特殊 情况,闰年且输入月份大于 3 时需考虑多加一天。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int day,month,year,sum, printf(&\nplease input year,month,day\n&); scanf(&%d,%d,%d&,&year,&month,&day); switch(month) /*先计算某月以前月份的总天数*/ { case 1:sum=0; case 2:sum=31; case 3:sum=59; case 4:sum=90; case 5:sum=120; case 6:sum=151; case 7:sum=181; case 8:sum=212; case 9:sum=243; case 10:sum=273; case 11:sum=304; case 12:sum=334; default:printf(&data error&); } sum=sum+ /*再加上某天的天数*/ if(year%400==0||(year%4==0&&year%100!=0)) /*判断是不是闰年*/ leap=1; else leap=0; if(leap==1&&month&2) /*如果是闰年且月份大于 2,总天数应该加一天*/ sum++; printf(&It is the %dth day.&,sum); getch(); } ===========================================【程序 101】 题目:输入三个整数 x,y,z,请把这三个数由小到大输出。 1.程序分析:我们想办法把最小的数放到 x 上,先将 x 与 y 进行比较,如果 x&y 则将 x 与 y 的值进行交换, 然后再用 x 与 z 进行比较,如果 x&z 则将 x 与 z 的值进行交换,这样能使 x 最小。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int x,y,z,t; scanf(&%d%d%d&,&x,&y,&z); if (x&y) {t=x;x=y;y=t;} /*交换 x,y 的值*/ if(x&z) {t=z;z=x;x=t;} /*交换 x,z 的值*/ if(y&z) {t=y;y=z;z=t;} /*交换 z,y 的值*/ printf(&small to big: %d %d %d\n&,x,y,z); getch(); } ===========================================【程序 102】 题目:用*号输出字母 C 的图案。 1.程序分析:可先用'*'号在纸上写出字母 C,再分行输出。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { printf(&Hello C-world!\n&); printf(& ****\n&); printf(& *\n&); printf(& * \n&); printf(& ****\n&); getch(); } ===========================================【程序 103】 题目:输出特殊图案,请在 c 环境中运行,看一看,Very Beautiful! 1.程序分析:字符共有 256 个。不同字符,图形不一样。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { char a=176,b=219; printf(&%c%c%c%c%c\n&,b,a,a,a,b); printf(&%c%c%c%c%c\n&,a,b,a,b,a); printf(&%c%c%c%c%c\n&,a,a,b,a,a); printf(&%c%c%c%c%c\n&,a,b,a,b,a); printf(&%c%c%c%c%c\n&,b,a,a,a,b); getch(); } ============================================================== 【程序 104】 题目:输出 9*9 口诀。 1.程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int i,j, printf(&\n&); for (i=1;i&10;i++) { for(j=1;j&10;j++) { result=i*j; printf(&%d*%d=%-3d&,i,j,result); /*-3d 表示左对齐,占 3 位*/ } printf(&\n&); /*每一行后换行*/ } getch(); } =========================================== 【程序 105】 题目:要求输出国际象棋棋盘。 1.程序分析:用 i 控制行,j 来控制列,根据 i+j 的和的变化来控制输出黑方格,还是白方格。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int i,j; for(i=0;i&8;i++) { for(j=0;j&8;j++) if((i+j)%2==0) printf(&%c%c&,219,219); else printf(& printf(&\n&); } getch(); } &); ============================================================== 【程序 10】 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 1.程序分析:用 i 控制行,j 来控制列,j 根据 i 的变化来控制输出黑方格的个数。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int i,j; printf(&\1\1\n&); /*输出两个笑脸*/ for(i=1;i&11;i++) { for(j=1;j&=i;j++) printf(&%c%c&,219,219); printf(&\n&); } getch(); } .:.:经典 c 程序 100 例==11--20 :.:. 经典 c 程序 100 例==11--20 【程序 106】 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 2.程序源代码: #include &stdio.h& #include &conio.h& main() { long f1,f2; 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; /*前两个月加起来赋值给第三个月*/ } 兔子的规律为数列 1,1,2,3,5,8,13,21.... getch(); } ============================================================== 【程序 107】 题目:判断 101-200 之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 2.程序源代码: #include &stdio.h& #include &conio.h& #include &math.h& main() { int m,i,k,h=0,leap=1; printf(&\n&); for(m=101;m&=200;m++) { k=sqrt(m+1); for(i=2;i&=k;i++) if(m%i==0) { leap=0; } if(leap) { printf(&%-4d&,m); h++; if(h%10==0) printf(&\n&); } leap=1; } printf(&\nThe total is %d&,h); getch(); } =========================================== 【程序 108】 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153 是一个“水仙花数”,因为 153=1 的三次方+5 的三次方+3 的三次方。 1.程序分析:利用 for 循环控制 100-999 个数,每个数分解出个位,十位,百位。 2.程序源代码: #include &stdio.h& #include &conio.h& 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); } getch(); } =========================================== 【程序 109】 题目:将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5。 程序分析:对 n 进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成: (1)如果这个质数恰等于 n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果 n&&k,但 n 能被 k 整除,则应打印出 k 的值,并用 n 除以 k 的商,作为新的正整数你 n, 重复执行第一步。 (3)如果 n 不能被 k 整除,则用 k+1 作为 k 的值,重复执行第一步。 2.程序源代码: /* zheng int is divided yinshu*/ #include &stdio.h& #include &conio.h& main() { int n,i; printf(&\nplease input a number:\n&); scanf(&%d&,&n); printf(&%d=&,n); for(i=2;i&=n;i++) while(n!=i) { if(n%i==0) { printf(&%d*&,i); n=n/i; } } printf(&%d&,n); getch(); } =========================================== 【程序 110】 题目:利用条件运算符的嵌套来完成此题:学习成绩&=90 分的同学用 A 表示,60-89 分之间的用 B 表示, 60 分以下的用 C 表示。 1.程序分析:(a&b)?a:b 这是条件运算符的基本例子。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { printf(&please input a score\n&); scanf(&%d&,&score); grade=score&=90?'A':(score&=60?'B':'C'); printf(&%d belongs to %c&,score,grade); getch(); } =========================================== 【程序 111】 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int a,b,num1,num2, printf(&please input two numbers:\n&); scanf(&%d,%d&,&num1,&num2); if(num1&num2)/*交换两个数,使大数放在 num1 上*/ { temp=num1; num1=num2; num2= } a=num1;b=num2; while(b!=0)/*利用辗除法,直到 b 为 0 为止*/ { temp=a%b; a=b; b= } printf(&gongyueshu:%d\n&,a); printf(&gongbeishu:%d\n&,num1*num2/a); getch(); } ===========================================【程序 112】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用 while 语句,条件为输入的字符不为'\n'.2.程序源代码: #include &stdio.h& #include &conio.h& main() { int letters=0,space=0,digit=0,others=0; printf(&please input some characters\n&); while((c=getchar())!='\n') { if(c&='a'&&c&='z'||c&='A'&&c&='Z') letters++; else if(c==' ') space++; else if(c&='0'&&c&='9') digit++; else others++; } printf(&all in all:char=%d space=%d digit=%d others=%d\n&,letters, space,digit,others); getch(); } =========================================== 【程序 113】 题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。例如 2+22+222+(此时 共有 5 个数相加),几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int a,n,count=1; long int sn=0,tn=0; printf(&please input a and n\n&); scanf(&%d,%d&,&a,&n); printf(&a=%d,n=%d\n&,a,n); while(count&=n) { tn=tn+a; sn=sn+ a=a*10; ++ } printf(&a+aa+...=%ld\n&,sn); getch(); } ==============================================================【程序 114】 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如 6=1+2+3.编程 找出 1000 以内的所有完数。 1. 程序分析:请参照程序&--上页程序 14. 2.程序源代码: #include &stdio.h& #include &conio.h& main() { static int k[10]; int i,j,n,s; for(j=2;j&1000;j++) { n=-1; s=j; for(i=1;i&j;i++) { if((j%i)==0) { n++; s=s-i; k[n]=i; } } if(s==0) { printf(&%d is a wanshu&,j); for(i=0;i&n;i++) printf(&%d,&,k[i]); printf(&%d\n&,k[n]); } } getch(); } ============================================================== 【程序 115】 题目:一球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第 10 次落地时,共经过多少米?第 10 次反弹多高? 1.程序分析:见下面注释 2.程序源代码: #include &stdio.h& #include &stdio.h& main() { float sn=100.0,hn=sn/2; for(n=2;n&=10;n++) { sn=sn+2*/*第 n 次落地时共经过的米数*/ hn=hn/2; /*第 n 次反跳高度*/ } printf(&the total of road is %f\n&,sn); printf(&the tenth is %f meter\n&,hn); getch(); } .:.:经典 c 程序 100 例==21--30:.:. 经典 c 程序 100 例==21--30 【程序 116】 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 1.程序分析:采取逆向思维的方法,从后往前推断。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int day,x1,x2; day=9; x2=1; while(day&0) { x1=(x2+1)*2;/*第一天的桃子数是第 2 天桃子数加 1 后的 2 倍*/ x2=x1; day--; } printf(&the total is %d\n&,x1); getch(); } =========================================== 【程序 117】 题目:两个乒乓球队进行比赛,各出三人。甲队为 a,b,c 三人,乙队为 x,y,z 三人。已抽签决定 比赛名单。有人向队员打听比赛的名单。a 说他不和 x 比,c 说他不和 x,z 比,请编程序找出 三队赛手的名单。 1.程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { char i,j,k;/*i 是 a 的对手,j 是 b 的对手,k 是 c 的对手*/ 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); } } } getch(); } ===========================================【程序 118】 题目:打印出如下图案(菱形) * *** ***** ******* ***** *** * 1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重 for 循环,第一层控制行,第二层控制列。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int i,j,k; for(i=0;i&=3;i++) { for(j=0;j&=2-i;j++) printf(& &); for(k=0;k&=2*i;k++) printf(&*&); printf(&\n&); } for(i=0;i&=2;i++) { for(j=0;j&=i;j++) printf(& &); for(k=0;k&=4-2*i;k++) printf(&*&); printf(&\n&); } getch(); } =========================================== 【程序 119】 题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项之和。 1.程序分析:请抓住分子与分母的变化规律。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int n,t,number=20; float a=2,b=1,s=0; for(n=1;n&=n++) { s=s+a/b; t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜 t 的作用*/ } printf(&sum is %9.6f\n&,s); getch(); } =========================================== 【程序 120】 题目:求 1+2!+3!+...+20!的和 1.程序分析:此程序只是把累加变成了累乘。 2.程序源代码: #include &stdio.h& #include &conio.h& main() { float n,s=0,t=1; for(n=1;n&=20;n++) { t*=n; s+=t; } printf(&1+2!+3!...+20!=%e\n&,s); getch(); } =========================================== 【程序 121】 题目:利用递归方法求 5!。 1.程序分析:递归公式:fn=fn_1*4! 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int fact(); for(i=0;i&5;i++) printf(&\40:%d!=%d\n&,i,fact(i)); getch(); } int fact(j) { if(j==0) sum=1; else sum=j*fact(j-1); } =========================================== 【程序 122】 题目:利用递归函数调用方式,将所输入的 5 个字符,以相反顺序打印出来。 1.程序分析: 2.程序源代码: #include &stdio.h& #include &conio.h& main() { int i=5; void palin(int n); printf(&\40:&); palin(i); printf(&\n&); getch(); } void palin(n) { if(n&=1) { next=getchar(); printf(&\n\0:&); putchar(next); } else { next=getchar(); palin(n-1); putchar(next); } } =========================================== 【程序 123】 题目:有 5 个人坐在一起,问第五个人多少岁?他说比第 4 个人大 2 岁。问第 4 个人岁数,他说比第 3 个人大 2 岁。问第三个人,又说比第 2 人大两岁。问第 2 个人,说比第一个人大两岁。最后 问第一个人,他说是 10 岁。请问第五个人多大? 1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道 第四人的岁数,依次类推,推到第一人(10 岁),再往回推。 2.程序源代码: #include &stdio.h& #include &conio.h& age(n) { if(n==1) c=10; else c=age(n-1)+2; return(c); } main() { printf(&%d&,age(5)); getch(); } =========================================== 【程序 124】 题目:给一个不多于 5 位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。 1. 程序分析:学会分解出每一位数,如下解释:(这里是一种简单的算法,师专数 002 班赵鑫提供) 2.程序源代码: #include &stdio.h& #include &conio.h& main( ) { long a,b,c,d,e,x; scanf(&%ld&,&x); a=x/10000;/*分解出万位*/ b=x%;/*分解出千位*/ c=x%;/*分解出百位*/ d=x%100/10;/*分解出十位*/ e=x%10;/*分解出个位*/ if (a!=0) printf(&there are 5, %ld %ld %ld %ld %ld\n&,e,d,c,b,a); else if (b!=0) printf(&there are 4, %ld %ld %ld %ld\n&,e,d,c,b); else if (c!=0) printf(& there are 3,%ld %ld %ld\n&,e,d,c); else if (d!=0) printf(&there are 2, %ld %ld\n&,e,d); else if (e!=0) printf(& there are 1,%ld\n&,e); getch(); } ===========================================【程序 125】 题目:一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千位相同。 1.程序分析:同 29 例 2.程序源代码: #include &stdio.h& #include &conio.h& main( ) { long ge,shi,qian,wan,x; scanf(&%ld&,&x); wan=x/10000; qian=x%; shi=x%100/10; ge=x%10; if(ge==wan&&shi==qian)/*个位等于万位并且十位等于千位*/ printf(&this number is a huiwen\n&); else printf(&this number is not a huiwen\n&); getch(); } .:.:经典 c 程序 100 例==31--40:.:. 经典 c 程序 100 例==31--40 【程序 126】 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母。 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或 if 语句判断第二个字母。 2.程序源代码: #include &stdio.h& #include &conio.h& void main() { printf(&please input the first letter of someday\n&); while((letter=getch())!='Y')/*当所按字母为 Y 时才结束*/ { switch (letter) { case 'S':printf(&please input second letter\n&); if((letter=getch())=='a') printf(&saturday\n&); else if ((letter=getch())=='u') printf(&sunday\n&); else printf(&data error\n&); case 'F':printf(&friday\n&); case 'M':printf(&monday\n&); case 'T':printf(&please input second letter\n&); if((letter=getch())=='u') printf(&tuesday\n&); else if ((letter=getch())=='h') printf(&thursday\n&); else printf(&data error\n&); case 'W':printf(&wednesday\n&); default: printf(&data error\n&); } } getch(); } ===========================================127 利用条件运算符的嵌套来完成此题: 学习成绩&=90 分的同学用 A 表示, 60-89 分之间的用 B 表示,60 分以下的用 C 表示。 1.程序分析:(a&b)?a:b 这是条件运算符的基本例子。 2.程序源代码: main() { printf(&please input a score\n&); scanf(&%d&,&score); grade=score&=90?'A':(score&=60?'B':'C'); printf(&%d belongs to %c&,score,grade); } 128编写函数 fun(),它的功能是:计算和输出下列级数的和。 S=1/(1×2)+1/(2×3)+…+1/(n×(n+1)) 例如,当 n=10 时,函数值为 0.909091。 注意:部分源程序给出如下。 请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入 所编写的若干语句。 试题程序: #include&conio.h& #include&stdio.h& double fun(int n) { int i=1,j=2,k; }double sum=0.0; for(k=0;k&n;k++) { sum+=1.0/(i*j); i++; j++;} main() { clrscr(); printf(&%f\n&,fun(10)); }129 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如 下: 每位数字都加上 5,然后用和除以 10 的余数代替该数字,再将第一位和第四位交换, 第二位和第三位交换。 1.程序分析: 2.程序源代码: main() {int a,i,aa[4],t; scanf(&%d&,&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%; 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]); } 130 下面程序的功能是:输出 100 以内能被 3 整除且个位数为 6 的所有整数,请填空。 #include main() { int i, for(i=0; i&=9 或 i&10 或 9&=i 或 10&i; i++) { j=i*10+6; if(j%3!=0 或 j%3 ) printf(&%d&,j); } } 131 判断一个素数能被几个 9 整除 1.程序分析: 2.程序源代码: main() { long int m9=9,sum=9; int zi,n1=1,c9=1; scanf(&%d&,&zi); while(n1!=0) { if(!(sum%zi)) n1=0; else {m9=m9*10; sum=sum+m9; c9++; } } printf(&%ld,can be divided by %d \&9\&&,sum,c9); } 132 将一个正整数分解质因数。例如:输入 90,打印出 90=2*3*3*5。 程序分析:对 n 进行分解质因数,应先找到一个最小的质数 k,然后按下述步骤完成: (1)如果这个质数恰等于 n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果 n&&k,但 n 能被 k 整除,则应打印出 k 的值,并用 n 除以 k 的商,作为新的正整数你 n, 重复执行第一步。 (3)如果 n 不能被 k 整除,则用 k+1 作为 k 的值,重复执行第一步。 程序源代码: /* zheng int is divided yinshu*/ main() { int n,i; printf(&\nplease input a number:\n&); scanf(&%d&,&n); printf(&%d=&,n); for(i=2;i&=n;i++) { while(n!=i) { if(n%i==0) { printf(&%d*&,i); n=n/i; } } } printf(&%d&,n);}133 打印出如下图案 * *** ****** ******** 程序源代码: main() { int i,j,k; for(i=0;i&=3;i++) { for(j=0;j&=2-i;j++) printf(& &); for(k=0;k&=2*i;k++) printf(&*&); printf(&\n&); } } 134 请编写一个函数 void fun(int m,int k,int xx[]),该函数的功能是:将大于整数 m 且紧靠 m 的 k 个素数存入 xx 所指的数组中。 例如,若输入 17,5,则应输出:19,23,29,31,37。 注意:部分源程序给出如下。 请勿改动主函数 main 和其它函数中的任何去何内容,仅在函数 fun 的花括号中填入你编写 的若干语句。 试题程序。 #include &conio.h& #include &stdio.h& /*本题中的 for()循环用来判断一个数是否为素数, 由于个数只能是 k 个所以用 do-while 循环 来控制。*/ void fun(int m, int k, int xx[]) { int i,j=0,p=m+1; do {for( i=2; i&p; i++) if(p%i==0) if(i&=p) xx[j++]=p; p++; } while(j&k); } main() { int m,n,zz[1000]; printf(&\n please enter two integers: &); scanf(&%d%d&,&m,&n); fun( m,n,zz); for(m=0; m&n; m++) printf(&%d &, zz[m]); printf(&\n&); } 135 古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后 每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列 1,1,2,3,5,8,13,21.... 2.程序源代码: main() { long f1,f2; 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; /*前两个月加起来赋值给第四个月*/ } } 136 )写程序,实现矩阵(3 行 3 列)的转置(即行列互换) 。 试题程序: #include &stdio.h& #include &conio.h& int fun(int array[3][3]) { int i,j,t; for(i=0;i&2;i++) for(j=i+1;j&3;j++) {t=array[i][j];array[i][j]=array[j][i];array[j][i]=t;} } main() { int i,j; int array[3][3]={{100,200,300},{400,500,600},{700,800,900}}; clrscr(); for(i=0;i&3;i++) {for(j=0;j&3;j++) printf(&%7d&,array[i][j]); printf(&\n&); } fun(array); printf(&Converted array:\n&); for(i=0;i&3;i++) {for(j=0;j&3;j++) printf(&%7d&,array[i][j]); printf(&\n&); } } 137 要求程序的功能是:把 20 个随机数存入一个数组,然后输出该数组中的最小值。其 中确定最小值的下标的操作在 fun 函数中实现,请给出该函数的定义。 试题程序。 #include &stdio.h& #include &conio.h& #define VSIZE 20 int vector[VSIZE]; /*注:该题的算法是用一个变量(j)来存储最小值元素的下标,在循环过程中让每个元素都 与原最小值元素进行大小比较(if(list[i]&list[j]),如发现更小的则让 j 重新拥有最小值元素的 下标(j=i)。*/ int fun(int list[],int size) { int i,j=0; for(i=1;i&i++) if(list[i]&list[j]) j=i; } main() { clrscr(); for(i=0;i&VSIZE;i++) { vector[i]=rand(); printf(&Vector[%d]=%6d\n&,i,vector[i]); } i=fun(vector,VSIZE); printf(&\nMininum:vector[%d]=%6d\n&,i,vector[i]); } 138 编写函数 fun,函数的功能是:从字符串中删除指定的字符。同一字母的大小写按不同字符 处理。 若程序执行时,输入字符串为:turbo c and Borland c++ 从键盘上输入字符:n,则输出后变为:turbo c ad borlad c++ 如果输入的字符串不存在,则字符串照原样输出。 试题程序。 #include &stdio.h& #include &conio.h& /*注:该题的算法是让 i 控制一个一个字符往后走,在移动过程中如果 s[i]不是要删的字符, 则将其按顺序放到新串中(新串亦是用 s 来做,只是用 k 来控制新串的下标,由于要删除一 些元素,因此新串的下标总是比原下标 i 要慢。因而可用此法即同一字符串变量的方法。*/ int fun(char s[],int c) {int i,k=0; for(i=0;s[i];i++) if(s[i]!=c) s[k++]=s[i]; s[k]='\0'; } main() { static char str[]=&turbo c and borland c++&; clrscr(); printf(& :%s\n&,str); printf(& :&); scanf(&%c&,&ch); fun(str,ch); printf(&str[]=%s\n&,str); } 139 试编程判断输入的正整数是否既是 3 又是 5 的整数倍数。若是,则输出 yes;否则输出 no。 #include&stdio.h& int main() { printf(&input a number:&); scanf(&%d&,&a); if(a%3==0 && a%5==0) printf(&yes&); else printf(&no&); getch(); }140 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前 20 项之和。 1.程序分析:请抓住分子与分母的变化规律。 2.程序源代码: main() { int n,t,number=20; float a=2,b=1,s=0; for(n=1;n&=n++) { s=s+a/b; t=a;a=a+b;b=t;/*这部分是程序的关键,请读者猜猜 t 的作用*/ } printf(&sum is %9.6f\n&,s); } 141 输入三个整数 x,y,z,请把这三个数由小到大输出。 1.程序分析:我们想办法把最小的数放到 x 上,先将 x 与 y 进行比较,如果 x&y 则将 x 与 y 的值进行交换,然后再用 x 与 z 进行比较,如果 x&z 则将 x 与 z 的值进行交换,这样能使 x 最小。 2.程序源代码: main() { int x,y,z,t; scanf(&%d%d%d&,&x,&y,&z); if (x&y) {t=x;x=y;y=t;} /*交换 x,y 的值*/ if(x&z) {t=z;z=x;x=t;}/*交换 x,z 的值*/ if(y&z) {t=y;y=z;z=t;}/*交换 z,y 的值*/ printf(&small to big: %d %d %d\n&,x,y,z); } 142 一球从 100 米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第 10 次落地时,共经过多少米?第 10 次反弹多高? 1.程序分析:见下面注释 2.程序源代码: main() { float sn=100.0,hn=sn/2; for(n=2;n&=10;n++) { sn=sn+2*/*第 n 次落地时共经过的米数*/ hn=hn/2; /*第 n 次反跳高度*/ } printf(&the total of road is %f\n&,sn); printf(&the tenth is %f meter\n&,hn); } 143 将一个数组逆序输出。 1.程序分析:用第一个与最后一个交换。 2.程序源代码: #define N 5 main() { int a[N]={9,6,5,4,1},i, printf(&\n original array:\n&); for(i=0;i printf(&%4d&,a[i]); for(i=0;i {temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]= } printf(&\n sorted array:\n&); for(i=0;i printf(&%4d&,a[i]); } 145 求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。例如 2+22+222+(此时共有 5 个数相加),几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 2.程序源代码: main() { int a,n,count=1; long int sn=0,tn=0; printf(&please input a and n\n&); scanf(&%d,%d&,&a,&n); printf(&a=%d,n=%d\n&,a,n); while(count&=n) { tn=tn+a; sn=sn+ a=a*10; ++ } printf(&a+aa+...=%ld\n&,sn); } 19.求 1+2!+3!+...+20!的和 1.程序分析:此程序只是把累加变成了累乘。 2.程序源代码: main() { float n,s=0,t=1; for(n=1;n&=20;n++) { t*=n; s+=t; } printf(&1+2!+3!...+20!=%e\n&,s); } 146 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用 while 语句,条件为输入的字符不为'\n'. 2.程序源代码: #i nclude &stdio.h& main() { int letters=0,space=0,digit=0,others=0; printf(&please input some characters\n&); while((c=getchar())!='\n') { if(c&='a'&&c&='z'||c&='A'&&c&='Z') letters++; else if(c==' ') space++; else if(c&='0'&&c&='9') digit++; else others++; } printf(&all in all:char=%d space=%d digit=%d others=%d\n&,letters, space,digit,others); }147 对 10 个数进行排序 1.程序分析: 可以利用选择法, 即从后 9 个比较过程中, 选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后 8 个进行比较,并进行交换。 2.程序源代码: #define N 10 main() {int i,j,min,tem,a[N]; /*input data*/ printf(&please input ten num:\n&); for(i=0;i&=n;i++) printf(&a[%d]=&,i); scanf(&%d&,&a[i]);} printf(&\n&); for(i=0;iprintf(&%5d&,a[i]); printf(&\n&); /*sort ten num*/ for(i=0;i{min=i; for(j=i+1;jif(a[min]&a[j]) min=j; tem=a[i]; a[i]=a[min]; a[min]= } /*output data*/ printf(&After sorted \n&); for(i=0;i&=n;i++,printf(&%5d&,a[i])); } 148 :一个 5 位数,判断它是不是回文数。即 12321 是回文数,个位与万位相同,十位与千位相 同。 1.程序分析:同 29 例 2.程序源代码: main( ) { long ge,shi,qian,wan,x; scanf(&%ld&,&x); wan=x/10000; qian=x%; shi=x%100/10; ge=x%10; if (ge==wan&&shi==qian)/*个位等于万位并且十位等于千位*/ printf(&this number is a huiwen\n&); else printf(&this number is not a huiwen\n&); } 149 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半, 又多吃了一个。 以后每天早上都吃了前一天剩 下 的一半零一个。到第 10 天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多 少。 1.程序分析:采取逆向思维的方法,从后往前推断。 2.程序源代码: main() { int day,x1,x2; day=9; x2=1; while(day&0) {x1=(x2+1)*2;/*第一天的桃子数是第 2 天桃子数加 1 后的 2 倍*/ x2=x1; day--; } printf(&the total is %d\n&,x1); } 150 从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个#为止。 1.程序分析: 2.程序源代码: #include &stdio.h& main() { FILE * char ch,filename[10]; scanf(&%s&,filename); if((fp=fopen(filename,&w&))==NULL) {printf(&cannot open file\n&); exit(0);} ch=getchar(); ch=getchar(); while(ch!='#') {fputc(ch,fp);putchar(ch); ch=getchar(); } fclose(fp); } 151 以下程序的功能是输出如下形式的方阵: 13 14 15 16 9 10 11 12 5 6 7 8 1 2 3 4 请填空。 main() { int i,j,x; for(j=4; j &0 j--) { for(i=1; i&=4; i++) { x=(j-1)*4 + 6 printf(&%4d&,x); } printf(&\n&); } } 152 请编一个函数 float fun(double h),函数的功能是对变量 h 中的值保留 2 位小数,并对第三位 进行四舍五入(规定 h 中的值为正数) 。 例如:h 值为 8.32433,则函数返回 8.32;h 值为 8.32533,则函数返回 8.33。 试题程序。 #include &stdio.h& #include &conio.h& /*注:h 乘以 1000 后正好是原小数点后第三位做了新数的个位数,然后再进行加 5 运算时。 如原小数点后第三位为 4 及以下则加 5 后还是不能进一位(即四舍) ,如是 5 及以上则加 5 后该位就要向前进一位数 (即五入) 。 进行加 5 运算后除 10 再赋给一个整型变量此时就只有 原小数点第二位及以前各位保留在整型变量中,最后再对整型变量除 100,这样又出现了两 位小数。该题中,进行四舍五入后一定要赋给一个整型变量才能将不用部分彻底变成 0 。 */ float fun(float h) { h=h*1000; t=(h+5)/10; return (float)t/100; } main() { clrscr(); printf(&Enter a:&); scanf(&%f&,&a); printf(&The original data is:&); printf(&%f\n\n&,a); printf(&The result :%6.2f\n&,fun(a)); } 153 请编写一个 unsigned fun(unsigned w),w 是一个大于 10 的无符号整数,若 w 是 n(n &=2)位的整数,函数求出 w 的后 n-1 位的数作为函数值返回。 例如:w 值为 5923,则函数返回 923;w 值为 923 则函数返回 23。 试题程序。 #include &conio.h& #include &stdio.h& /* 注:由于 unsigned 型整数在 0-65535 这间,只要它大于 10000 则对 10000 求余 即得出后面 4 位, 否则如果大于 1000 则对 1000 求余得出后 3 位数, 这样一层一层往小 的判断。由于 return 的作用除了返回值以外,还有当执行到 return 时就跳出该程序,所 以可以连续的用 if()语句。 */ unsigned fun( unsigned w ) { if(w&=10000) return w%10000; if(w&=1000) return w%1000; if(w&=100) return w%100; return w%10; } main() { printf( &enter a unsigned integer number :& ); scanf( &%u&,&x); if(x&10) printf(&data error!&); else printf (&the result :%u\n&, fun(x)); } 154 以下程序中函数 huiwen 的功能是检查一个字符串是否是回文,当字符串是回文时,函数返 回字符串:yes!,否则函数返回字符串:no!,并在主函数中输出,所谓回文即正向与反向 的拼写都一样,例如:adgda。请填空。 #include char *huiwen(char *str) { char *p1,*p2; int i,t=0; p1=p2= str+strlen(str)-1 for(i=0;i&=strlen(

我要回帖

更多关于 输入正整数n 计算阶乘 的文章

 

随机推荐