C语言趣味编程100例

合集下载

C语言趣味程序百例精解大全

C语言趣味程序百例精解大全
第十二章-其他趣味程序
94.兔子产子
95.将阿拉伯数字转换为罗马数字
96.选美比赛
97.满足特异条件的数列
98.八皇后问题
99.超长正整数的加法
100.数字移动
《C语言趣味程序百例精解》CHM V1.0
第七章-逻辑推理与判断
48.新娘和新郞
49.委派任务
50.谁在说谎
51.谁是窃贼
52.黑与白
53.谜语博士的难题(1)
54.谜语博士的难题(2)
55.哪个大夫哪天值班
56.区分旅客国籍
57.谁家孩子跑最慢
65.乘式还原(2) 思考题
68.九位累进可除数 思考题
76.小明买书 思考题
77.波松瓦的分酒趣题 思考题
87.青蛙交换 思考题
88.常胜将军 思考题
89.抢30 思考题
90.搬山游戏 思考题
92.人机猜数游戏(2) 思考题
96.选美比赛 思考题
98.八皇后问题 思考题
99.超长正整数的加法 思考题
本电子书所有代码均在Windows XP SP2,Microsoft Visual C++ 6.0环境下测试通过。
在电子书制作过程中,本人得到了CSDN以下网友的热心帮助,特此感谢!
他们是gfxiang,lihui_shine,raincatss。
如果发现任何错误,包括错别字,程序问题,请立即指出,以便修正。
2.绘制余弦曲线和直线 在屏幕上显示0-360度的cos(x)曲线与直线f(x)=45*(y-1)+31的迭加图形。其中cos(x)图形用“*”表示,f(x)用“+”表示,在两个图形相交的点上则用f(x)图形的符号。 *问题分析与算法设计 本题可以在上题的基础上进行修改。图形迭加的关键是要在分别计算出同一行中两个图形的列方向点坐标后,正确判断相互的位置关系。为此,可以先判断图形的交点,再分别控制打印两个不同的图形。 *程序注释与说明 #include #include void main() { double y; int x,m,n,yy; for(yy=0;yy #include void main() { double y; int x,m,n; for(y=1;y>=-1;y-=0.1) { m=(int)(asin(y)*10); n=(int)(acos(y)*10); for(x=0;x

C语言趣味程序百例

C语言趣味程序百例

C语言趣味程序百例(1):绘制余弦曲线public class test1{public static void main(String args[]){double y;double x, m;for (y=1;y>-1;y-=0.1) {m= Math.acos(y) * 10;for (x = 1; x < m; x++)System.out.print(" ");System.out.print("*");for (; x < 62 - m; x++)System.out.print(" ");System.out.println("*");}}}C语言趣味程序百例(3):绘制圆public class test3{public static void main(String args[]) {double y;double x, m;for(y=10;y>=-10;y--){m=2*Math.sqrt(100-y*y);for(x=1;x<30-m;x++)System.out.print(" ");System.out.print("*");for(;x<30+m;x++)System.out.print(" ");System.out.println("*");}}}import java.util.*;public class test4{public static void main(String args[]){int max=0;int min=100;double sum=0;for(int i=1;i<=10;i++){System.out.printf("请输入第"+i+"个分数:\n");Scanner reader=new Scanner(System.in);int x=reader.nextInt();sum+=x;if(x> max) max=x;if(x< min) min=x;}System.out.println("无效的最高分和最低分:"+max+" , "+min);System.out.println("最后选手的得分是:"+(sum-max-min)/8.0);}}public class test5{public static void main(String args[]){for (int i=999;i>99;i--) {if (555555%i==0) {System.out.println("最大约数="+i);return;}}}}C语言趣味程序百例(12):抓交通肇事犯public class test12{public static void main(String args[]){int k;for(int i=1;i<=9;i++){for(int j=0;j<=9;j++){if(i!=j){k=i*1000+i*100+j*10+j;for(int c=31;c< 100;c++){if(c*c==k)System.out.println("肇事车牌号是"+k);}}}}}}public class test38{public static void main(String args[]){int count = 0;for (int i = 0; i <= 100; i++)for (int j = 0; j <= 50; j++)for (int k = 0; k <= 20; k++) {if (i + j * 2 + k * 5 == 100) {System.out.println(count++ + ":" + i + "-" + j + "-" + k);}}}}public class test40{public static void main(String args[]){for (int i = 0; i <= 3; i++)for (int j = 0; j <= 3; j++) {if (8 - i - j <= 6)System.out.println("Res=" + i + " White=" + j + " Black="+ (8 - i - j));}}}C语言趣味程序百例(54):博士的难题2public class test54{public static void main(String args[]){for (int a = 1; a <= 3; a++)for (int b = 1; b <= 3; b++)for (int c = 1; c <= 3; c++)if ((a != b && b != c && a != c)&& (a == 1 && b == 1 || a == 2 && b != 1 || a == 3)&& (b == 1 && b == 3 || b == 2 && b != 3 || b == 3)&& (c == 1 && b == 2 || c == 2 && b != 2 || c == 3)) {System.out.println("1表示诚实族,2表示说谎族,3表示两面族");System.out.println("a=" + a);System.out.println("b=" + b);System.out.println("c=" + c);}}}C语言趣味程序百例(62):奇特立方体public class test62{public static void main(String args[]){int x[]=new int[8];for(int i=0;i<8;i++){x[i]=Integer.parseInt(args[i]);}new test62().cube62(x);}public void cube62(int x[]) {int n = 8;boolean success=false;for (int a = 0; a < n; a++)for (int b = 0; b < n; b++)for (int c = 0; c < n; c++)for (int d =0; d < n; d++)for (int e = 0; e < n; e++)for (int f = 0; f < n; f++)for (int g = 0; g < n; g++)for (int h =0; h < n; h++) {if (notEquls(new int[] { x[a],x[b], x[c],x[d],x[e],x[f],x[g],x[h]})) {if(cube62(x[a],x[b], x[c], x[d], x[e], x[f], x[g], x[h])) return;}}if(success!=true) System.out.println("不能构成奇妙立方体");;}public boolean cube62(int a, int b, int c, int d, int e, int f, int g, int h) {boolean success=false;int s = a + b + c + d;if (s == e + f + g + h)if (s == a + b + e + f)if (s == c + d + g + h)if (s == a + c + e + g)if (s == b + d + f + h) {System.out.println("能构成奇特立方体");System.out.print(" a=" + a);System.out.print(" b=" + b);System.out.print(" c=" + c);System.out.print(" d=" + d);System.out.print(" e=" + e);System.out.print(" f=" + f);System.out.print(" g=" + g);System.out.println(" h=" + h);System.out.println("构成的奇特立方体如下图:");System.out.println(" e/----------/f");System.out.println(" a/----------/b|");System.out.println(" | | | |");System.out.println(" | | | |");System.out.println(" | | | |");System.out.println(" |g/--------|-/h");System.out.println(" c/----------/d");return true;}return success;}public boolean notEquls(int[] a) {if (a == null || a.length == 0 || a.length == 1)return true;for (int i = 0; i < a.length; i++) {for (int j = 0; j < a.length; j++) {if (a[i] == a[j] && i != j) {return false;}}}return true;}}public class test49{public static void main(String args[]){for (int a = 0; a <= 1; a++)for (int b = 0; b <= 1; b++)for (int c = 0; c <= 1; c++)for (int d = 0; d <= 1; d++)for (int e = 0; e <= 1; e++)for (int f = 0; f <= 1; f++) {if (a + b >= 1&& a + d <= 1&& a + e + f == 2&& (b + c == 0 || b + c == 2)&& (c + d == 1)&& ((d == 0 && e == 0) || (d == 1 ))) {System.out.println("0是不去,1是去");System.out.println("a="+a);System.out.println("b="+b);System.out.println("c="+c);System.out.println("d="+d);System.out.println("e="+e);System.out.println("f="+f);}}}}import java.io.*;public class test10{public static void main(String[] args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("input int:");String s=br.readLine();int val=Integer.parseInt(s);System.out.println(getBits(val));}public static String getBits(int value){int displayMask=1<<31;StringBuffer buf=new StringBuffer(35);for(int c=1;c<=32;c++){buf.append((value & displayMask)==0? '0':'1');value<<=1;if(c%8==0)buf.append(' ');}return buf.toString();}}public class test9{public static void main(String args[]){int n=Integer.parseInt(args[0]);System.out.println("N="+n);for(int i=0;i<=n;i++){for(int j=0;j< 12-i;j++) System.out.printf(" ");for(int j=1;j< i+2;j++) System.out.printf("%6d",c(i,j));System.out.println();}}public static int c(int x,int y){int z;if((y==1)||(y==x+1)) return 1;z=c(x-1,y-1)+c(x-1,y);return z;}}C语言趣味程序百例(79):随机数求圆周率public class test79{public static void main(String args[]){double all=10000000;double l=1000000;double pai=0;double in=0;double x=0,y=0;for (int i=0;i<all;i++) {x=(Math.random()*l);y=(Math.random()*l);if(x*x+y*y<l*l)in++;}pai=(in/all*4);System.out.println("Times/All="+in+"/"+all+" "+"π~="+pai);}}。

经典C语言程序设计100例(1-60)

经典C语言程序设计100例(1-60)

经典C语言程序设计100例【程序1】题目:有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) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}}【程序2】题目:企业发放的奖金根据利润提成。

利润(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(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}-----------------------------------------------------------------------------【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。

经典C语言编程100例精编版

经典C语言编程100例精编版

经典C语言编程100例(1-30)【程序1】题目:有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) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}}============================================================== 【程序2】题目:企业发放的奖金根据利润提成。

利润(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(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}============================================================== 【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。

C语言趣味程序设计——题目百例

C语言趣味程序设计——题目百例

Contest - 2011级C语言课程大作业Start Time: 2012-02-19 16:25:00 End Time: 2012-03-01 22:00:00 Current Time: 2012-2-23 15:51:18 Status:Running Public写在最前:本文档中的题目;在不不同的编译器中可能会有提示错误,呵呵,小小的动动手改下变量的定义就可以运行了………………..由于能力不足..有题目未解决的…或者有错误的我会…认真听取大家的..意见的….呵呵……..有一两个….偷了下懒哦………提供原题目还有本人自己的解答的源代码。

感谢大家的。

建议…………….问题A: 趣味程序设计_狼追兔子时间限制: 1 Sec 内存限制: 128 MB提交: 341 解决: 63[提交][状态][讨论版]题目描述一只兔子躲进了n个环形分布的洞的某一个中。

狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找;也没有找到,就隔两个洞,到第六个洞去找。

以后每次多一个洞去找兔子……这样下去,如果一直找不到兔子,请问兔子可能在哪个洞中?输入有多组测试数据,读取到文件结尾符为止。

每组测试数据输入n(2≤n≤100),即洞穴个数。

输入到文件结尾符为止。

输出兔子可能藏匿的洞。

如果不止一个,按从小到大的顺序输出。

如果不存在,输出空行。

样例输入10815样例输出2 4 7 92 4 5 7 8 9 11 12 14提示用一个数组a[10],对应的元素a[0],a[1],a[2]……a[9]对应表示10个洞,初值均置1。

通过一个循环用“穷举法”找兔子,第n次查找对应第(n-1)%10个洞,如果在第(n-1)%10个洞中没有找到兔子,因此将数组元素a[(n-1)%10]置0值。

循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。

#include<stdio.h>#include<string.h>int ok[110];int main(){int n,s,i,find;while(scanf("%d",&n)!=EOF){memset(ok,0,sizeof(ok));for(i=1;i<=200;i++)if(!ok[find=(i*(i+1)/2)%n])if(find==0)ok[n]=1;elseok[find]=1;for(s=0,i=1;i<=n;i++)s+=ok[i];for(i=1,find=0;i<=n;i++)if(!ok[i]){if(find!=(n-s-1)){printf("%d ",i);find++;}elseprintf("%d",i);}printf("\n");}return 0;}问题B: 趣味程序设计_巧夺偶数时间限制: 1 Sec 内存限制: 128 MB提交: 174 解决: 73[提交][状态][讨论版]题目描述桌子上有25颗棋子。

c趣味编程100例(含答案)

c趣味编程100例(含答案)
}
}
*思考题
实现函数y=x2的图形与圆的图形叠加显示
4.歌星大奖赛
在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
*问题分析与算法实现
这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。
44.分数之和 61
45.将真分数分解为埃及分数 63
46.列出真分数序列 65
47.计算分数的精确值 66
48.新娘和新郞 68
49.委派任务 70
50.谁在说谎 73
51.谁是窃贼 74
52.黑与白 76
53.迷语博士的难题(1) 79
54.迷语博士的难题(2) 81
55.哪个大夫哪天值班 84
87.黑白子交换 164
88.常胜将军 168
89.抢 30 169
90.搬山游戏 172
91.人机猜数游戏 176
92.人机猜数游戏(2) 179
93.汉诺塔 183
94.兎子产子 187
95.将阿拉伯数字转换为罗马数字 189
96.选美比赛 191
97.满足特异条件的数列 193
66.除式还原(1) 117
67.除式还原(2) 120
68.九位累进可除数 124
69.魔术师的猜牌术(1) 128
70.魔术师的猜牌术(2) 129
71.约瑟夫问题 131
72.邮票组合 134
73 和数能表示1~23的5个正整数 135
74.可称1~40磅的4块砝码 137

(完整版)c语言程序设计100例(考研专用)

(完整版)c语言程序设计100例(考研专用)

(完整版)c语言程序设计100例(考研专用)经典c程序100例==1--10【程序1】题目:有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) /*确保i、j、k三位互不相同*/printf("%d,%d,%d\n",i,j,k);}}============================================================== 【程序2】题目:企业发放的奖金根据利润提成。

利润(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(){long int i;int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;scanf("%ld",&i);bonus1=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+200000*0.5;bonus6=bonus4+200000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;else if(i<=200000)bonus=bonus1+(i-100000)*0.075;else if(i<=400000)bonus=bonus2+(i-200000)*0.05;else if(i<=600000)bonus=bonus4+(i-400000)*0.03;else if(i<=1000000)bonus=bonus6+(i-600000)*0.015;elsebonus=bonus10+(i-1000000)*0.01;printf("bonus=%d",bonus);}====================================== ======================== 【程序3】题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。

C语言程序设计100个简单的经典例子

C语言程序设计100个简单的经典例子

经典C语言程序设计100例1.数字排列2.奖金分配问题3.已知条件求解整数4.输入日期判断第几天5.输入整数进行排序6.用*号显示字母C的图案7.显示特殊图案8.打印九九口诀9.输出国际象棋棋盘10.打印楼梯并按条件打印笑脸11.经典兔子问题12.判断素数13.水仙花数问题14.正整数分解质因数15.学习成绩划分16.正整数求其最大公约数和最小公倍数17.统计英文字母/空格/数字个数18.求s=a+aa+aaa+aa...a的值19.求解"完数"20.球体自由落下物理问题21.猴子吃桃问题22.乒乓球比赛抽签问题23.打印菱形图案24.分数数列求和25.求1+2!+3!+...+20!的和26.利用递归方法求5!27.将输入字符以相反顺序打印28.岁数问题29.求解正整数位数30.判断回文数31.星期几猜测游戏32.改变文本颜色33.学习gotoxy()与clrscr()函数34.练习函数调用35.设置文本颜色36.求100之内的素数37.对10个数进行排序38.求3*3矩阵对角线元素之和39.数字插入数组重新排序40.将一个数组逆序输出41.static定义静态变量用法42.使用auto定义变量用法43.使用static的另一用法44.使用external的用法45.使用register定义变量方法46.宏#define命令练习(1)47.宏#define命令练习(2)48.宏#define命令练习(3)49.#if #ifdef和#ifndef的综合应用50.#include 的应用练习51.学习使用按位与&52.学习使用按位或|53.学习使用按位异或^54.取一个整数从右端开始的4~7位。

55.学习使用按位取反~56.用circle画圆形57.学用line画直线58.用rectangle画方形59.画图综合例子160.画图综合例子261.打印杨辉三角形62.学习putpixel画点63.画椭圆ellipse64.利用ellipse and rectangle画图65.画个最优美的图案66.输入3个数字按大小顺序输出67.输入数组交换元素重新输出68.多个整数后移位置问题69.圆圈报数问题70.计算一个字符串长度71.编写输入/输出函数72.创建链表73.反向输出链表74.连接两个链表75.算一道简单题目76.调用函数求1/2+1/4+...+1/n77.填空练习(指向指针的指针)78.找到年龄最大的人79.字符串排序80.海滩猴子分桃81.已知公式条件求数字82.八进制转换为十进制83.求0-7所能组成的奇数个数84.由两个素数之和表示的偶数85.判断一个素数能被几个9整除86.两个字符串连接程序87.结构体变量传递88.读取数字的整数值并打印出该值个数的*89.数据加密90.专升本一题91.时间函数举例192.时间函数举例293.时间函数举例394.一个猜数游戏95.家庭财务管理小程序96.计算字符串中子串出现的次数97.输入字符并保存到磁盘98.字符串转换成大写字母并输出保存99.文件操作应用1100.文件操作应用2--------------------------------------------------------------------------------c语言经典100题【实用】【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*保证每次循环时 s 的初值为 0*/ /*判断 j 是否为 i 的因子*/
3.2 亲 密 数
1.问题描述
如果整数 A 的全部因子(包括 1,不包括 A 本身)之和等于 B;且整数 B 的全部因子 (包括 1,不包括 B 本身)之和等于 A,则将整数 A 和 B 称为亲密数。求 3000 以内的全部
注意:C 语言中的整数问题,经常涉及判断两数是否相等或某变量(或表达式)是否 满足某一条件的情况,对于这类问题,初学者经常会存在对赋值符号“=”与等于号“==” 混淆的问题。
赋值符号“=”:基本的赋值运算符是“=”。它的优先级别低于其他的运算符,所以对 该运算符往往最后读取。它的作用是将一个表达式的值赋给一个(左值)变量,左值必须 能够被修改,不能是常量。如 while(i=10)……此表达式的作用是将右值“10”赋给左值 i, 每次判断 i 的值都为 10,所以表达式的值为非 0,即判定条件为真,导致程序进入死循环。
第 3 章 “各种”趣味整数
整数通常是程序设计语言的一种基础形态,例如 Java 及 C 编程语言的 int 类型。整数 问题是实际应用中遇到的一类问题。整型数据从所占内存大小可分为基本整型(int)、长 整型(long int)和短整型(short int),根据数据满足的某些性质又可将其分为“完全数”、 “水仙花数”、“亲密数”等。整数问题中经常用到的是对数据的拆分、组合,初学者一定要 从实例中总结方法并掌握。本章主要通过对各类整数问题的算法进行讲解,以培养读者的 编程思维方式与编程技巧。本章主要内容如下:
4.求某给定数的位数
求一个数的位数可以借助最高位的权值来计算,对于十进制来说,个位的权值为 100, 十位的权值为 101,百位的权值为 102 ,……,一个存储三位数的变量 n=123,每次除以 10,将得到的值再赋给 n 直到 n 的值为 0,最多可以除 3 次;若变量 n 中存储的是四位数, 用同样的方法去除以 10,最多可以除 4 次。可以发现,直到变量变为 0,除以 10 的次数即 为当前给定数的位数。程序如下:
后面这个程序看上去似乎没有什么问题,但是仔细分析一下会发现:在最初定义的 时候给变量 b 和 n 赋初值 0,第一次执行循环体时,将 a 和 b 的因子分别累加到 b 和 n, 得到的 b、n 值确实是两个变量的因子之和,但是当第二次再次执行循环体时,b 和 n 的 初值已不再是 0,当再次把求得的因子累加到其上时,最后 b 和 n 存储的值并不是所求 当前变量的因子之和(还包括上次判断的变量的因子之和),因此最后没有符合条件的 a 和 b。
#include<stdio.h>
·75·
C 语言趣味编程 100 例
void main()
{
int n,count=0;
scanf("%d",&n); while(n!=0) { n=n/10; count++; } printf("%d",count);
乘法中,对积的后三位产生影响的部分积分别为:
第一个部分积中:被乘数最后三位*乘数的倒数第一位。
第二个部分积中:被乘数最后二位*乘数的倒数第二位。
第三个部分积中:被乘数最后一位*乘数的倒数第三位。
将以上的部分积的后三位求和后,截取后三位就是三位数乘积的后三位,这样的规律
可以推广到同样问题的不同位数乘积中。
5.完整程序
#include<stdio.h>
void main()
{
int a,i,b,n;
printf("There are following friendly--numbers pair smaller than
3000:\n");
for(a=1;a<3000;a++)
/*穷举 3000 以内的全部整数*/
·70·
第 3 章 “各种”趣味整数
for(i=2;i<=n;i++)
{
s=0;
/*保证每次循环时 s 的初值为 0*/
for(j=1;j<i;j++)
{
if(i%j==0) s+=j;
/*判断 j 是否为 i 的因子*/
}
if(s==i)
/*判断因子之和是否和原数相等*/
printf("It's a perfect number:%d.\n",i);
{
for(b=0,i=1;i<=a/2;i++)
/*计算数 a 的各因子,各因子之和存放于 b*/
if(!(a%i))
b+=i;
for(n=0,i=1;i<=b/2;i++)
/*计算 b 的各因子,各因子之和存于 n*/
if(!(b%i))
n+=i;
if(n==a&&a<b)
printf("%4d--%4d ",a,b); /*若 n=a,则 a 和 b 是一对亲密数,输出*/
for(i=2;i<=n;i++) { … for(j=1;j<i;j++) { … } if(s==i) 输出当前 i 是完数
}
对于某个选定的数,将求得的各因子累加到变量 s(累加过程中用到 s 的初值,所以 s 初值为 0)之后,s 的值发生改变,若直接将下一个选定数的因子加到 s 上,得到的值并非 所求(此时 s 的初值不是 0 而是上一个选定数的因子之和)。因此每次判断下一个选定数之 前,必须将变量 s 的值重新置为 0,编程过程中一定要注意变量 s 重新置 0 的位置,语句 放的位置不正确得到的结果也不是正确结果。
在 n/2~n−1 范围内没有数据可以整除此数。据此,我们可以把遍历范围缩小至 1~n−1, 这样程序效率可以提高一倍。相应程序如下:
#include<stdio.h> main() { …
for(i=2;i<=1000;i++) {
s=0; for(j=1;j<=n/2;j++) {
if(i%j==0) s+=j; } … } }
C 语言趣味编程 100 例
满足条件的数时,一般采用遍历的方式,对给定范围内的数值一个一个地去判断是否满足 条件,这一过程可利用循环来实现。
本题的关键是求出选取数值 i 的因子,即从 1 到 i-1 范围内能整除 i 的数,看某一个数 j 是不是 i 的因子,可利用语句 if(i%j==0)进行判断,求某一个数的所有因子,需要在 1 到 i-1 范围内进行遍历,同样采用循环实现。因此,本题从整体上看可利用两层循环来实现。 外层循环控制该数的范围 2~n;内层循环 j 控制除数的范围为 1~i,通过 i 对 j 取余,是 否等于 0,找到该数的各个因子,程序段如下:
}
}
图 3.1 程序流程图
6.运行结果 程序运行结图如图 3.2 所示。 7.问题拓展 上述程序中求某数的因子时,采用从 1 到 i-1 范围内进行 遍历的方法,一个数一个数地去试。这种方法可以做到没有遗
图 3.2 运行结果 ·71·
C 语言趣味编程 100 例
漏,但是效率不高。 对于某一整数来说,其最大因子为 n/2(若 n 为偶数时,若为奇数最大因子小于 n/2),
4.确定程序框架
程序流程图如图 3.1 所示。
5.完整程序
#include<stdio.h>
main()
{
int i,j,s,n;
/*变量 i 控制选定数范围,j 控制除数范围,s 记录累加因子之和*/
printf("请输入所选范围上限:");
scanf("%d",&n);
/* n 的值由键盘输入*/
if(!(b%i))
n+=i;
if(n==a&&a<b)
printf("%4d--%4d ",a,b); /*若 n=a,则 a 和 b 是一对亲密数,输出*/
}
}
将原程序稍做改动,在最初定义的时候给变量 b、n 赋初值为 0,其运行结果如图 3.5 所示。
图 3.5 运行结果
从图 3.5 中可以看出程序并没有输出结果,即在 3000 这个范围内没有找到亲密数,而 实际上亲密数是存在的,为什么呢?
根据自守数的定义,求解本题的关键是知道当前所求自然数的位数,以及该数平方的 尾数与被乘数、乘数之间的关系。
3.算法设计
若采用“求出一个数的平方后再截取最后相应位数”的方法显然是不可取的,因为计
算机无法表示过大的整数。
分析手工方式下整数平方(乘法)的计算过程,以 376 为例:
376
被乘数
× 376
乘数
3000:\n");
for(a=1;a<3000;a++)
/*穷举 3000 以内的全部整数*/
{
for(i=1;i<=a/2;i++)
/*计算数 a 的各因子,各因子之和存放于 b*/
if(!(a%i))
b+=i;
for(i=1;i<=b/2;i++)
/*计算 b 的各因子,各因子之和存于 n*/
2256
第一个部分积=被乘数*乘数的倒数第一位
2632
第二个部分积=被乘数*位
141376

本问题所关心的是积的最后三位。分析产生积的后三位的过程可以看出,在每一次的
部分积中,并不是它的每一位都会对积的后三位产生影响。总结规律可以得到:在三位数
相关文档
最新文档