论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: 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趣味程序百例(26)

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

80.奇数平方的一个有趣性质
81.角谷猜想
82.四方定理
83.卡布列克常数



80.奇数平方的一个有趣性质
    编程验证“大于1000的奇数其平方与1的差是8的倍数”。
*问题分析与算法设计
    本题是一个很轻易证实的数学定理,我们可以编写程序验证它。
    题目中给出的处理过程很清楚,算法不需要非凡设计。可以按照题目的叙述直接进行验证(程序中仅验证到3000)。
*程序与程序注释
#include<stdio.h>
void main()
{
    long int a;
    for(a=1001;a<=3000;a+=2)
    {
        printf("%ld:",a);       /*输出奇数本身*/
        printf("(%ld*%ld-1)/8",a,a);      /*输出(奇数的平方减1)/8*/
        printf("=%ld",(a*a-1)/8);        /*输出被8除后的商*/
        printf("+%ld\n",(a*a-1)%8);      /*输出被8除后的余数*/
    }
}
*运行结果
    最后十个数的运算结果如下:


------------------------------------------------------------------

81.角谷猜想
    日本一位中学生发现一个奇妙的“定理”,请角谷教授证实,而教授无能为力,于是产生角谷猜想。猜想的内容是:任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。请编程验证。
*问题分析与算法设计
    本题是一个沿未获得一般证实的猜想,但屡试不爽,可以用程序验证。
    题目中给出的处理过程很清楚,算法不需非凡设计,可按照题目的叙述直接进行证。
*程序与程序注释
#include<stdio.h>
void main()
{
    int n,count=0;
    printf("Please enter number:");
    scanf("%d",&n);      /*输入任一整数*/
    do{
        if(n%2)
        {
            n=n*3+1;           /*若为奇数,n乘3加1*/
            printf("[%d]:%d*3+1=%d\n",++count,(n-1)/3,n);
        }
        else
        {
            n/=2;          /*若为偶数n除以2*/
            printf("[%d]:  %d/2=%d\n",++count,2*n,n);
        }
    }while(n!=1);             /*n不等于1则继续以上过程*/
}
*运行结果
   

--------------------------------------------------------------

82.四方定理
   数论中闻名的“四方定理”讲的是:所有自然数至多只要用四个数的平方和就可以表示。
   请编程证此定理。
*问题分析与算法设计
    本题是一个定理,我们不去证实它而是编程序验证。
    对四个变量采用试探的方法进行计算,满足要求时输出计算结果。
*程序与程序注释
#include<stdio.h>
#include<stdlib.h>
void main()
{
    int number,i,j,k,l;
    printf("Please enter a number=");
    scanf("%d",&number);                /*输入整数*/
    for(i=1;i<number/2;i++)         /*试探法。试探i,j,k,k的不同值*/
        for(j=0;j<=i;j++)
            for(k=0;k<=j;k++)
                for(l=0;l<=k;l++)
                    if(number==i*i+j*j+k*k+l*l)    /*若满足定理要求则输出结果*/
                    {
                        printf(" %d=%d*%d+%d*%d+%d*%d+%d*%d\n",number,i,i,j,j,k,k,l,l);
                        exit(0);
                    }
}
*运行结果
    1) Please enter a number = 110
       110=7*7+6*6+4*4+3*3
    2) Please enter a number = 211
       211=8*8+7*7+7*7+7*7
    3) Please enter a number = 99
       99=7*7+5*5+4*4+3*3

----------------------------------------------------------

83.卡布列克常数
        验证卡布列克运算。任意一个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律:
    1)将组成该四位数的四个数字由大到小排列,形成由这四个数字构成的最大的四位数;
    2)将组成该四位数的四个数字由小到大排列,形成由这四个数字构成的最小的四位数(假如四个数中含有0,则得到的数不足四位);
    3)求两个数的差,得到一个新的四位数(高位零保留)。
    重复以上过程,最后得到的结果是6174,这个数被称为卡布列克数。
*问题分析与算法设计
    题目中给出的处理过程很清楚,算法不需要非凡设计,可按照题目的叙述直接进行验证。
*程序与程序注释
#include<stdio.h>
void vr6174(int);
void parse_sort(int num,int *each);
void max_min(int *each,int *max,int *min);
void parse_sort(int num,int *each);
int count=0;
void main()
{
    int n;
    printf("Enter a number:");
    scanf("%d", &n);        /*输入任意正整数*/
    vr6174(n);           /*调用函数进行验证*/
}

void vr6174(int num)
{
    int each[4],max,min;
    if(num!=6174&&num)    /*若不等于74且不等于0则进行卡布列克运算*/
    {
        parse_sort(num,each);         /*将整数分解,数字存入each数组中*/
        max_min(each,&max,&min);      /*求数字组成的最大值和最小值*/      
        num=max-min;          /*求最大值和最小值的差*/
        printf("[%d]:  %d-%d=%d\n",++count,max,min,num); /*输出该步计算过程*/
        vr6174(num);         /*递归调用自身继续进行卡布列克运算*/
    }
}
void parse_sort(int num,int *each)
{
    int i,*j,*k,temp;
    for(i=0;i<=4;i++)         /*将NUM分解为数字*/
    {
        j=each+3-i;
        *j=num%10;
        num/=10;
    }
    for(i=0;i<3;i++)     /*对各保数字从小到大进行排序*/
        for(j=each,k=each+1;j<each+3-i;j++,k++)
            if(*j>*k) { temp=*j;*j=*k;*k=temp;}
    return;
}
void max_min(int *each,int *max,int *min)    /*将分解的数字还原为最大整数和最小整数*/
{
    int *i;
    *min=0;
    for(i=each;i<each+4;i++)     /*还原为最小的整数*/
        *min=*min*10+*i;
    *max=0;
    for(i=each+3;i>=each;i--)    /*还原为最大的整数*/
        *max=*max*10+*i;
    return;
}

*运行结果
        1) Enter a number:4312
            [1]:4312-1234=3078
            [2]:8730-378=8352
            [3]:8532-2358=6174
        2) Enter a number:8720
            [1]:8720-278=8442
            [2]:8442-2448=5994
            [3]:9954-4599=5355
            [4]:5553-3555=1998
            [5]:9981-1899=8082
            [6]:8820-288=8523
            [7]:8532-2358=6174
        3)Enter a number:9643
            [1]:9643-3469=6174

上一篇:{实例}C趣味程序百例(25) 人气:6997
下一篇:{实例}C趣味编程百例(27) 人气:5395
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程