博文
[原创]四行代码算1000阶乘精确值(2007-04-24 13:19:00)
摘要:#include<stdio.h>#define N 1000 //要计算的Nlong 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 //要计算的Nlong 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!的精确值:402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476......
实时控制输入内容的长度(2007-04-13 20:23:00)
摘要:以下代码(GetStringEX函数)能实现在控制台下有类似WindowsGDI界面的文本框最大输入文本长度的那种效果,个人感觉效果不错哈哈#include <stdio.h> //putchar#include <conio.h> //getch#include <windows.h> //MessageBeepint GetStringEX(char* cpBuffer,int nMaxChars){ int cInput, nCount = 0; while( (cInput = getch()) != '\r' ) { if(cInput == '\b') //BackSpace { if(nCount > 0) { nCount--, printf("\b \b"); &nbs......
生成奇数阶等和幻方代码(超短)(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++)//计算生成 nList[(n1*(n-1)+(n1/n)*2)%n][(n1+(n>>1)-n1/n)%n]=n1+1; for(n2=0......
解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;}......
关于两组有序数据组合成一组有序数据的问题(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;}//主函数mainint main(void){ char a[256]={0},b[256]={0},c[512]={0}; scanf("%s",a);getchar();sort(a); scanf("%s",b);g......
