| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3777 人关注过本帖
标题:[讨论]]第十一期编程题目(题目很简单,大家一起来做了)
只看楼主 加入收藏
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
正整数m的正整数n次幂

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>

typedef unsigned long U4;

int mul(U4* xx,U4 yy,int ws);

void main( )
//精确计算自然数n的m次幂
//限制: n 小于10亿,m=2,3,…
//环境: VC++6.0
{
U4 nn,*pp;
int mm,ws,i;
printf("底数,幂次=");
scanf("%lu,%d",&nn,&mm);
if(nn>=1e9||mm<2)abort( );
//确定结果是几位数(10进制)
ws=mm*log10((double)nn)+1;
//定结果是几位数(10亿进制)
ws=(ws+8)/9;
//申请U4型动态数组(存放结果)
pp=(U4*)malloc(ws*sizeof(U4));
if(pp==NULL)abort( );
//现在pp[]中存放的是nn的1次幂
pp[0]=nn;for(i=1;i<ws;i++)pp[i]=0L;
ws=1;//当前结果(在10亿进制下)的位数
//下面这个语句负责计算nn的mm次幂
for(i=2;i<=mm;i++)ws=mul(pp,nn,ws);
//以下按10进制显示nn的mm次幂
printf("%lu",pp[ws-1]);
for(i=ws-2;i>=0;i--)printf("%09lu",pp[i]);
printf("\n");
//释放动态数组pp
free(pp);
}

int mul(U4* xx,U4 yy,int ws)
//10亿进制多位数xx与一位
//数yy相乘,积仍放在xx中。
//形参ws为被乘数xx的位数,
//函数返回值为乘积的位数。
{ int i;
U4 cy=0,billion=1000000000;
__asm mov edi,xx
for(i=0;i<ws;i++)
{
__asm mov eax,[edi]
__asm mul Dword ptr yy
__asm add eax,cy
__asm adc edx,0
__asm div Dword ptr billion
__asm mov [edi],edx
__asm mov cy,eax
__asm add edi,04
}
if(cy)xx[i]=cy,ws++;
return ws;
}

2007-04-15 10:22
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
yu_huad的第一个题目对了.第二个题目要改进一下.建议不要用那个abort( );题目的测试数据都是合法的.
中间的汇编不是很懂,估计想发不错
我不是郭靖斑竹第二个是正确的

2007-04-15 11:00
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 

大家参考一下
第一个题目
#include <stdio.h>
int main()
{
unsigned long x,y,m,n,l;
while (scanf ("%ld %ld %ld %ld %ld",&x,&y,&m,&n,&l)!=EOF)
{
if (m>n)
{
m=m-n;
x=(y-x+l)%l;
}
else
{
m=n-m;
x=(x-y+l)%l;
}
n=x/m;
x=x%m;
y=x;
while (1)
{
if (y==0)
{
printf ("%d\n",n);
break;
}
n+=(y+l)/m;
y=(y+l)%m;
if (y==x)
{
printf ("Impossible\n");
break;
}
}
}
return 0;
}


2007-04-15 21:16
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 

第二个
#include<stdio.h>
void main()
{
char s[7];
int i,j,n,m,k,flag;
long int a[100]={0};
char st[395]={'0'};
a[0]=1;
while(scanf("%s %d",s,&n)!=EOF)
{

for(i=0;i<100;i++)
a[i]=0;
for(i=0;i<396;i++)
st[i]='\0';
st[0]='0';
a[0]=1;
m=0;
j=1;
flag=-1;
for(i=0;s[i];i++);
k=i-1;
for(i--;i>=0;i--)
{
if(s[i]=='.')
{
flag=(k-i)*n;
continue;
}
else
{
m+=(s[i]-'0')*j;
j*=10;
}
}
while(n--)
{
for(i=0;i<100;i++)
a[i]*=m;
for(i=0;i<100;i++)
{
a[i+1]=a[i+1]+(a[i]/10000);
a[i]=a[i]%10000;
}
}
for(i=0,k=0;i<99;i++,k+=4)
{
st[k+3]=a[i]/1000+'0';
a[i]%=1000;
st[k+2]=a[i]/100+'0';
a[i]%=100;
st[k+1]=a[i]/10+'0';
a[i]%=10;
st[k]=a[i]+'0';
}
for(i=395;i>=flag;i--)
{
if(st[i]!='0')
break;
}
for(j=0;j<flag;j++)
{
if(st[j]!='0')
break;
}
if(i<j)
printf("0\n");
else
{
for(i;i>=j;i--)
{
if(i==flag-1)
printf(".");
printf("%c",st[i]);
}
printf("\n");
}
}
}


2007-04-15 21:17
jiangliangju
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-3-9
收藏
得分:0 
强,我不是郭靖斑竹
2007-04-15 21:28
dhf123
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-4-18
收藏
得分:0 

新手
各们高手多多指叫

2007-04-18 17:18
crackerwang
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:833
专家分:0
注 册:2007-2-14
收藏
得分:0 
这一期做的最好的是yu_hua
moonwalker
也不错
斑竹们掏钱吧
下一期我想由我们其中的一位斑竹来出题.
他发的ACM题目我觉得都还不错,算法也不是很难.
所以下期由pcrazyc斑竹来出题.
大家多多支持哦

2007-04-19 12:31
快速回复:[讨论]]第十一期编程题目(题目很简单,大家一起来做了)
数据加载中...
 
   



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

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