博文
[原创]四行代码算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......
实时控制输入内容的长度(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");
......
生成奇数阶等和幻方代码(超短)(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++)//计算生成
......
解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;
}
//主函数main
int main(void)
{
char a[256]={0},b[256]={0},c[512]={0};
&......