| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1926 人关注过本帖
标题:求一算法,谢了!
只看楼主 加入收藏
罗彬
Rank: 1
等 级:新手上路
帖 子:141
专家分:0
注 册:2006-4-24
收藏
得分:0 
14楼那个程序有问题哈,我验证了,有错误码,数字大的时候他输出的都是6

2006-04-24 17:58
剑人
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-9-21
收藏
得分:0 

^_^

你们写的算法都没考虑效率呀!

2006-04-24 23:29
youxiaxyz
Rank: 1
等 级:新手上路
帖 子:85
专家分:0
注 册:2006-4-5
收藏
得分:0 
能不能把题目变难一些求n!的左数第二位数
2006-05-01 14:13
private
Rank: 1
等 级:新手上路
帖 子:110
专家分:0
注 册:2006-5-1
收藏
得分:0 

int find(int x)

{ int a=0;
while ((a=x%10)==0)
{
x/= 10;
}
return a;
}
//我没写主函数,把那个介乘的的结果 传给这个函数就可以了.


2006-05-01 16:30
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

呵呵,44楼的,你好可爱哦~!
那个阶乘的高位处理才是难点,你显的有点避重就轻;

[此贴子已经被作者于2006-5-1 16:48:01编辑过]


对不礼貌的女生收钱......
2006-05-01 16:47
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

//在10进制情况下,末尾的零是怎样形成的呢:
//1。直接遇见末尾为0的乘数。如10、20、100等
//2。被乘数末位为2,4,6,8时又遇见尾数带5的
//乘数如5,15,25等。
//3。如4!=24,用5乘(忽略0)变为12,遇6变成72
//遇7变成504,遇8变成4032,遇9变成36288,跳过
//10,再与11乘时,可扔掉高2位,288*11即可...


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-01 19:04
剑人
Rank: 1
等 级:新手上路
帖 子:58
专家分:0
注 册:2005-9-21
收藏
得分:0 
^_^
与我的想法一样牙!
同路人!
2006-05-01 21:36
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(–★–)//在10进制情况下,末尾的零是怎样形...
以下是引用–★–在2006-5-1 19:04:00的发言:

//在10进制情况下,末尾的零是怎样形成的呢:
//1。直接遇见末尾为0的乘数。如10、20、100等
//2。被乘数末位为2,4,6,8时又遇见尾数带5的
//乘数如5,15,25等。
//3。如4!=24,用5乘(忽略0)变为12,遇6变成72
//遇7变成504,遇8变成4032,遇9变成36288,跳过
//10,再与11乘时,可扔掉高2位,288*11即可...

//下面给出以上算法的代码
//用户输入正整数N,输出N阶乘最后那个非零位
#include<stdio.h>
typedef unsigned long ui4;
typedef unsigned short ui2;
ui2 mul(ui2,ui4);
int main()
{
ui4 N,n;
ui2 k,tail=1;
scanf("%li",&N);
for(n=2;n<=N;n++)
tail = mul(tail,n);
printf("last non-zero digit = %i\n",tail%10);
return 0;
}
ui2 mul(ui2 a,ui4 b)
{
ui2 mul=a;
//太饿了,等我填饱肚子再填mul()的肚子
return mul;
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-02 06:49
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

//下面给出以上算法的代码
//用户输入正整数N,输出N阶乘最后那个非零位
#include<stdio.h>
typedef unsigned long ui4;
ui4 mul(ui4,ui4);
int main()
{
ui4 N,n;
ui4 tail=1;
scanf("%li",&N);
for(n=2;n<=N;n++)
tail = mul(tail,n);
printf("last non-zero digit = ");
printf("%i\n",tail%10);
return 0;
}
ui4 mul(ui4 a,ui4 b)
{
ui4 mu=a;
if(b%2==0 && mu%5==0)
mu=mul(mu/5,b/2);
else if(b%5==0 && mu%2==0)
mu=mul(mu/2,b/5);
else
mu*=b;
return mu%10000;
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-02 08:20
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
回复:(–★–)//下面给出以上算法的代码//用户输入...

//各位可用下列程序验证–★–
//给出的N!末尾非零位代码
//计算万以内(含10000)阶乘
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
short mul(short a[],short d,short x)
{ long i,y=0;
for(i=0;i<d;i++)
{ y+=a[i]*(long)x;//x:乘数
a[i]=(short)(y%10000);
y/=10000;
}
a[d]=(short)y;
return d+!!y;//返回(万进制下的)位数
}
void main()
{
long s;
short *a,i,j,n,ws=1;
printf("N=");scanf("%d",&n);
#define Pi 3.14159265358979323846L
s=(long)((log(2*Pi*n)/2+n*(log(n)-1))/log(10)+1);
a=(short*)malloc((s/4+2)*sizeof(short));*a=1;

for(i=2;i<=n;i++)
ws=mul(a,ws,i);

printf("%d!=%d",n,a[ws-1]);
for(j=ws-2;j>=0;j--)
printf("%04d",a[j]);
printf("\n");
free(a);
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-02 08:27
快速回复:求一算法,谢了!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017958 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved