博文

[原创]四行代码算1000阶乘精确值(2007-04-24 13:19:00)

摘要:#include<stdio.h>
#define N 1000    //要计算的N
long s[N]={1,1},n=N,t=2,a=1,b=0;
int main()//雨中飞燕之作
{
    for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)
        s[a]=(b+=s[a]*t)%10000,b/=10000;
    for(printf("%d",s[*s]);--*s>0;)printf("%04d",s[*s]);
    return 0;
}
在VC6,DevC,Code::Block上测试,算1000!用时毫秒级

最少字节数版本(从long定义变量开始计算共155字节,不计算换行)
#include<stdio.h> //雨中飞燕之作
#define N 1000 //要计算的N
long s[N]={1},n=10000,t=2,a,b,m;main(){
for(;a<=m||++t<=N&&(a=b=0,1);m==a++&&b&&m++)
s[a]=(b+=s[a]*t)%n,b/=n;
for(printf("%d",s[m]);m--;)printf("%04d",s[m]);}

附1000!的精确值:
40238726007709377354370243392300398571937486421071463254379991042993851239862902
05920442084869694048004799886101971960586316668729948085589013238296699445909974
245040870737599188236277271887325197795059509952......

阅读全文(14656) | 评论:77

实时控制输入内容的长度(2007-04-13 20:23:00)

摘要:以下代码(GetStringEX函数)能实现在控制台下有类似WindowsGDI界面的文本框最大输入文本长度的那种效果,个人感觉效果不错哈哈

#include <stdio.h>    //putchar
#include <conio.h>    //getch
#include <windows.h>  //MessageBeep

int GetStringEX(char* cpBuffer,int nMaxChars)
{
    int cInput, nCount = 0;
    while( (cInput = getch()) != '\r' )
    {
        if(cInput == '\b') //BackSpace
        {
            if(nCount > 0)
            {
                nCount--, printf("\b \b");
......

阅读全文(3233) | 评论:3

生成奇数阶等和幻方代码(超短)(2007-04-14 08:55:00)

摘要:很短,但应该不是最短,仅用循环来完成
#include <stdio.h>  //头文件 版本一(数字1在中间偏右):
int main()
{
    long nList[19][19],n=0,n1,n2,nh;
    while(n%2==0)scanf("%d",&n);//输入阶数
    for(n2=n*n,n1=0,nh=n/2;n1<n2;n1++)//计算生成
        nList[(n1*(n-1)+nh+n1/n)%n][(n1+nh+1+n1/n)%n]=n1+1;
    for(n2=0;n2<n;n2++)//结果输出
    {
        for(n1=0;n1<n;n1++)printf("%4d",nList[n2][n1]);
        printf("\n");
    }
    return 0;
}

版本二(数字1在第一行中间):
int main()
{
    long nList[31][31],n=0,n1,n2;
    while(!(n&1))scanf("%d",&n);//输入阶数
    for(n2=n*n,n1=0;n1<n2;n1++)//计算生成
       ......

阅读全文(4484) | 评论:10

解Joseph(约瑟夫)环问题的牛代码(2007-03-29 08:22:00)

摘要:摘录自本网站论坛(原作者不清楚,知情者请留言告诉偶)
问题描述:n个人围成一个环,编号1-n,然后从1号开始报数,报m的出列,下一个人再从1开始报,求出列的人的编号顺序(或者求谁最后出列)
#include <stdio.h>
#include <conio.h>
int main( void )
{
    int n, i = 0, m, p;
    scanf("%d%d", &n, &m); //n总人数,m步长
    while( ++i <= n )
    {
        p = i * m;
        while (p > n)
            p = p - n + (p - n - 1)/(m - 1);
        printf("%d\n", p);
    }
    getch();return 0;
}
......

阅读全文(7474) | 评论:25

关于两组有序数据组合成一组有序数据的问题(2007-03-26 18:35:00)

摘要:从小到大排序好的数据连接生成新的数据(也是从小到大),并且要去掉重复数据
这里用字符串作为例子,完成本功能的函数是combineStr
旨在示例一下指针的操控(运用了指向指针的指针)

//字符串连接 *pTag 目标字符串  *pa和*pb要进行连接的字符串
void combineStr(char *pTag ,char *pa,char *pb)
{
    char **pp;pTag--;
    while(*pa||*pb)
    {
        if(!*pb || *pa && *pa<=*pb)pp=&pa;else pp=&pb;
        if(*pTag!=**pp)*++pTag=**pp;(*pp)++;
    }
}

//字符串排序
void sort(char *cpStr)
{
    char *pa,*pb,ct;
    for(pa=cpStr;*pa;pa++)for(pb=pa+1;*pb;pb++)
    if(*pa>*pb)ct=*pa,*pa=*pb,*pb=ct;
}

//主函数main
int main(void)
{
    char a[256]={0},b[256]={0},c[512]={0};
 &......

阅读全文(4012) | 评论:9