-------刷夜开始--------
2006-10-4 23:51
1.分数变小数
写出一个程序,接受一个以N/D的形式输入的分数,其中N为分子,D为分母,输出它的小数形式。如果它的小数形式存在循环
节,要将其用括号括起来。例如:1/3=.00000...表示为.(3),又如41/333=.123123123...表示为.(123)。
一些转化的例子:
1/3=.(3)
22/5=4.4
1/7=.(142857)
3/8=.375
45/46=.803(571428)
用上面的分数和11/59来测试你的程序。
运行举例:
ENTER N,D:17
1/7=.(142857)
本题中,0<=N<=65535,0<=D<=65535,设运算结果小数点后最多保留100位。
code by WiZiM:
main()
{
int shang[100],yushu[100];
int a,b,n=1;
int i,j;
int found=0;
printf("Please input:a/b ");
scanf("%d/%d",&a,&b);
printf("Answer:%d/%d=",a,b);
printf("%d.",shang[0]=a/b);
yushu[0]=a%b;
while(1)
{
yushu[n]=yushu[n-1]*10%b;
shang[n]=yushu[n-1]*10/b;
for(i=1;i<=n-1;i++)
{
if(yushu[i]==yushu[n]&&shang[i]==shang[n])
{
found=1;
break;
}
}
if(yushu[n]==0||found==1)
break;
n++;
}
if(found==0)
{
for(j=1;j<=n;j++)
{
printf("%d",shang[j]);
}
}else
{
for(j=1;j<=i-1;j++)
{
printf("%d",shang[j]);
}
printf("{");
for(j=i;j<=n-1;j++)
{
printf("%d",shang[j]);
}
printf("}");
}
printf(" ");
getch();
}
2006-10-5 0:51
2.约瑟夫问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15
个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。
code by WiZiM:
int ren[30];
main()
{
int i,a;
int n=0,m=0;
for(i=0;i<=29;i++)
{
ren[i]=0;
}
/*---------find 9--------*/
while(m<15)
{
a=0;
while(a!=9)
{
if(ren[n]==0)
{
a++;
}
n=(n+1)%30;
}
printf("%d,",n);
ren[((n+30)-1)%30]=1;
m++;
}
for(i=0;i<=29;i++)
{
if(ren[i]==0)
printf("+");
else
printf("@");
}
printf(" ");
getch();
}
2006-10-5 1:20(作过算法总汇)
3.输出:
*
***
*****
*******
*****
***
*
code by WiZiM:
main()
{
int i,j;
for(i=0;i<=3;i++)
{
for(j=0;j<=6;j++)
{
if(j<=3+i&&j>=3-i)
printf("*");
else printf(" ");
}
printf(" ");
}
for(i=0;i<=2;i++)
{
for(j=0;j<=6;j++)
{
if(j<=3+(2-i)&&j>=3-(2-i))
printf("*");
else printf(" ");
}
printf(" ");
}
getch();
}
4.随机生成10个自然数,首先使用冒泡排序算法将数据按照从大到小的顺序排列;然后使用折半查找算法实现查找其中任意一个数(输入查找对象)。
code by WiZiM:
#include<math.h>
int a[10];
int ok(int b)
{
int i;
for(i=0;i<=9;i++)
{
if(a[i]==b)
break;
}
if(i==10)
return 0;
else
return 1;
}
int digui(int b,int t,int w)
{
if(a[(t+w)/2]>b)
digui(b,(t+w)/2+1,w);
else if(a[(t+w)/2]<b)
digui(b,t,(t+w)/2);
else
printf("it is No.%d",(t+w)/2+1);
}
main()
{
int i,j;
int temp,b;
for(i=0;i<=9;i++)
a[i]=rand()%100;
for(i=0;i<=9;i++)
{
for(j=8;j>=i;j--)
{
if(a[j]<a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
printf(" ");
for(i=0;i<=9;i++)
printf("%d ",a[i]);
printf("search:");
do{
scanf("%d",&b);
}
while(!ok(b));
digui(b,0,9);
}
5.分解质因数乘积形式
把指定区间上的所有整数分解质因数,每一整数表示为质因数从小到大顺序排列的乘积形式。如果被分解的数本身是素数,则予以注明。
例如,90=2*3*3*5,91=素数。
main()
{
int a,b;
int i,j,k,n,su;
printf(" a to b:? ");
scanf("%d%d",&a,&b);
printf(" %d,%d ",a,b);
for(i=a;i<=b;i++)
{
su=1;
printf("%d=",i);
n=i;
for (j=2;j<=n;j++)
{
while (n!=j)
{
if(n%j==0)
{
su=0;
printf("%d*",j);
n=n/j;
}
else
break;
}
}
if(su==1)
printf("su shu ");
else
printf("%d ",n);
}
}