论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

C趣味编程百例(27)

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:44:42

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趣味程序百例(26) 人气:7307
下一篇:{实例}C趣味程序百例(28) 人气:5217
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058