刷夜练算法

-------刷夜开始--------

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:

#include<stdio.h>
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:

 

#include<stdio.h>
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:

#include<stdio.h>
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<stdio.h>
#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=素数。

 

#include<stdio.h>
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);
    }
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值