84.尼科彻斯定理 85.回文数的形成 86.自动发牌
84.尼科彻斯定理 验证尼科彻斯定理,即:任何一个整数的立方都可以写成一串连续奇数的和。×× *问题分析与算法设计 本题是一个定理,我们先来证实它是成立的。 对于任一正整数a,不论a是奇数还是偶数,整数(a×a-a+1)必然为奇数。 构造一个等差数列,数列的首项为(a×a-a+1),等差数列的差值为2(奇数数列),则前a项的和为: a×((a×a-a+1))+2×a(a-1)/2 =a×a×a-a×a+a+a×a-a =a×a×a 定理成立。证毕。 通过定理的证实过程可知L所要求的奇数数列的首项为(a×a-a+1),长度为a。编程的算法不需要非凡设计,可按照定理的证实过直接进行验证。 *程序与程序注释 #include<stdio.h> void main() { int a,b,c,d; printf("Please enter a number:"); scanf("%d",&a); /*输入整数*/ b=a*a*a; /*求整数的三次方*/ printf("%d*%d*%d=%d=",a,a,a,b); for(d=0,c=0;c<a;c++) /*输出数列,首项为a*a-a+1,等差值为2*/ { d+=a*a-a+1+c*2; /*求数列的前a项的和*/ printf(c?"+%d":"%d",a*a-a+1+c*2); } if(d==b)printf(" Y\n"); /*若条件满足则输出“Y”*/ else printf(" N\n"); /*否则输出“N”*/ } *运行结果 1) Please enter a number:13 13*13*13=2197=157+159+161+163+165+167+169+171+173+175+177+179+181 Y 2) Please enter a number:14 14*14*14=2744=183+185+187+189+191+193+195+197+199+201+203+205+207+209 Y
*思考题 本题的求解方法是先证实,在证实的过程中找到编程的算法,然后实现编程。实际上我们也可以不进行证实,直接使用编程中常用的试探方法来找出该数列,验证该定理。请读者自行设计算法。当然这样得到的数列可能与用定理方法得到的数列不一样。
85.回文数的形成 任取一个十进制整数,将其倒过来后与原来的整数相加,得到一个新的整数后重复以上步聚,则最终可得到一个回文数。请编程验证。 *问题分析与算法设计 回文数的这一形成规则目前还属于一个猜想,尚未得到数学上的证实。有些回文数要经历上百个步聚才能获得。这里通过编程验证。 题目中给出的处理过程很清楚,算法不需要非凡设计。可按照题目的叙述直接进行验证。 *程序与程序注释 #include<stdio.h> #define MAX 2147483647 long re(long int); int nonres(long int s); void main() { long int n,m; int count=0; printf("Please enetr a number optionaly:"); scanf("%ld",&n); printf("The generation process of palindrome:\n"); while(!nonres((m=re(n))+n)) /*判定整数与其反序数相加后是否为回文数*/ { if(m+n>=MAX) { printf(" input error,break.\n"); break; } else { printf("[%d]:%ld+%ld=%ld\n",++count,n,m,m+n); n+=m; } } printf("[%d]:%ld+%ld=%ld\n",++count,n,m,m+n); /*输出最后得到的回文数*/ printf("Here we reached the aim at last!\n"); } long re(long int a) /*求输入整数的反序数*/ { long int t; for(t=0;a>0;a/=10) /*将整数反序*/ t=t*10+a%10; return t; } int nonres(long int s) /*判定给定的整数是否是回文数*/ { if(re(s)==s) return 1; /*若是回文数则返回1*/ else return 0; /*否则返回 0*/ } *运行结果
86.自动发牌 一副扑克有52张牌,打桥牌时应将牌分给四个人。请设计一个程序完成自动发牌的工作。要求:黑桃用S(Spaces)表示;红桃用H(Hearts)表示;方块用D(Diamonds)表示;梅花用C(Clubs)表示。 *问题分析与算法设计 按照打桥牌的规定,每人应当有13张牌。在人工发牌时,先进行洗牌,然后将洗好的牌按一定的顺序发给每一个人。为了便于计算机模拟,可将人工方式的发牌过程加以修改:先确定好发牌顺序:1、2、3、4;将52张牌顺序编号:黑桃2对应数字0,红桃2对应数字1,方块2对应数字2,梅花2对应数字3,黑桃3对应数字4,红桃3对应数字5,...然后从52 张牌中随机的为每个人抽牌。 这里采用C语言库函数的随机函数,生成0到51之间的共52个随机数,以产生洗牌后发牌的效果。 *程序与程序注释 #include<stdlib.h> #include<stdio.h> int comp(const void *j,const void *i); void p(int b[],char n[]); void main() { static char n[]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'}; int a[53],b1[13],b2[13],b3[13],b4[13]; int b11=0,b22=0,b33=0,b44=0,t=1,m,flag,i; while(t<=52) /*控制发52张牌*/ { m=random(52); /*产生0到51之间的随机数*/ for(flag=1,i=1;i<=t&&flag;i++) /*查找新产生的随机数是否已经存在*/ if(m==a[i]) flag=0; /*flag=1:产生的是新的随机数 flag=0:新产生的随机数已经存在*/ if(flag) { a[t++]=m; /*假如产生了新的随机数,则存入数组*/ if(t%4==0) b1[b11++]=a[t-1]; /*根据t的模值,判定当前*/ else if(t%4==1) b2[b22++]=a[t-1]; /*的牌应存入哪个数组中*/ else if(t%4==2) b3[b33++]=a[t-1]; else if(t%4==3) b4[b44++]=a[t-1]; } } qsort(b1,13,sizeof(int),comp); /*将每个人的牌进行排序*/ qsort(b2,13,sizeof(int),comp); qsort(b3,13,sizeof(int),comp); qsort(b4,13,sizeof(int),comp); p(b1,n); p(b2,n); p(b3,n); p(b4,n); /*分别打印每个人的牌*/ } void p(int b[],char n[]) { int i; printf("\n\006 "); /*打印黑桃标记*/ for(i=0;i<13;i++) /*将数组中的值转换为相应的花色*/ if(b[i]/13==0) printf("%c ",n[b[i]%13]); /*该花色对应的牌*/ printf("\n\003 "); /*打印红桃标记*/ for(i=0;i<13;i++) if((b[i]/13)==1) printf("%c ",n[b[i]%13]); printf("\n\004 "); /*打印方块标记*/ for(i=0;i<13;i++) if(b[i]/13==2) printf("%c ",n[b[i]%13]); printf("\n\005 "); /*打印梅花标记*/ for(i=0;i<13;i++) if(b[i]/13==3||b[i]/13==4) printf("%c ",n[b[i]%13]); printf("\n"); } int comp(const void *j,const void *i) /*qsort调用的排序函数*/ { return(*(int*)i-*(int*)j); } *运行示例
视频教程列表
文章教程搜索
C语言程序设计推荐教程
C语言程序设计热门教程
|