POJ 1001 Exponentiation
高精度数的计算, 以前在网上看到过一个计算大数阶乘比如10000000!的算法, 总体思想就是将结果用数组保存起来, 然后将结果的每一位与乘数相乘, 当然还有进位...
有了这个算法的思想, 这个题思路就可以是:先将输入的小数转换成一个整数, 当然这个整数肯定能够用int类型的变量保存, 比如1.2345, 通过函数 removeDot()将它转化成12345, 然后利用大数阶乘的思想计算*12345, 最后的就是输出了, 这个要考虑的情况比较多, 因为这个也WA了5次才AC(笨的要死), 情况虽多, 但不难.
这道题是高精度计算的,不算很难,但是很繁琐,尤其是对输入输出的要求。被这道题搞了好久,耐心来,一点一点调试,总会成功的。
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
char ans[10];
char res[2][205];
__int64 ps;//有几位小数点
int len;//长度,R的有效长度
//计算c = b * a
void Multiply(char * b,int bt,char * a,int at,char * c)
{
int i,j;
int up=0;
for(i=0;i<at;++i)
{
up=0;
for(j=0;j<bt;j++)
{
int t;
if(c[i+j]==0)
c[i+j]='0';
t=(a[i]-48)*(b[j]-48)+c[i+j]-48+up;
if(t>=10)
{
up=t/10;
t=t%10;
c[i+j]=t+48;
if(j==(bt-1) )
c[i+j+1]=(up+48);
}
else
{
c[i+j]=t+48;
up=0;
}
}
}
}
int main()
{
string str;
int n;
int i,j;
int s,t;
int pos;
while(cin>>str>>n)
{
i=5;
pos=str.find('.',0);
if(pos<0)//没有小数点
{
ps=0;
//zs=zs*n;//后面为0的总数
}
else//有小数点
{
ps=(5-pos);
ps=ps*n;//小数位总数
}
memset(ans,0,sizeof(ans));
memset(res[0],0,sizeof(res[0]));
memset(res[1],0,sizeof(res[1]));
t=5;
s=0;
while(str[s]=='0' || str[s]=='.')
s++;
j=0;
for(i=t;i>=s;--i)
{
if(str[i]=='.')
continue;
ans[j]=str[i];
j++;
}
len=j;
strcpy(res[0],ans);
strcpy(res[1],ans);
for(i=2;i<=n;++i)
{
memset(res[(i+1)%2],0,sizeof(res[0]));
Multiply(res[i%2],strlen(res[i%2]),ans,len,res[(i+1)%2]);
}
int L=strlen(res[(n+1)%2]);
int d=(n+1)%2;
if(ps>0)
{
j=0;
while(res[d][j]=='0')
j++;
if(ps>=L)
{
printf(".");
for(i=ps-1;i>=j ;--i)
{
if(i>=L)
printf("0");
else
printf("%c",res[(n+1)%2][i]);
}
}
else
{
if(j>=ps)
{
for(i=L-1;i>=ps;--i)
printf("%c",res[(n+1)%2][i]);
}
else
{
for(i=L-1;i>=j ;--i)
{
if(i==ps)
{
printf("%c.",res[(n+1)%2][i]);
}
else
printf("%c",res[(n+1)%2][i]);
}
}
}
}
else
{
for(i=L-1;i>=0;--i)
printf("%c",res[(n+1)%2][i]);
}
printf("\n");
}
return 0;
}
POJ 1047 Round and Round We Go
题意:输入一个数,要求判该数是否为循环数.
依次将该数分别于2到len(输入的数的位数)相乘,在乘的过程中,判断数发生了变化没有,如果发生了变化,则直接输出该数不是循环数,没有必要再继续乘下去,而如果是循环数,则一直需
要乘下去.
#include<iostream>
#include<string>
#include<cstdlib>
#include<algorithm>
using namespace std;
int num[70];
int ans[70];
char ss[70];
sizeof是什么bool match[70];
int main()
{
int i,j,k,len;
bool flag;
while(scanf("%s",ss)!=EOF)
{
len=strlen(ss);
for(i=len-1,j=0;i>=0;i--,j++)
num[j]=ss[i]-'0';
for(i=2;i<=len;i++)
{
memset(ans,0,sizeof(ans));
for(j=0;j<len;j++) //依次将该数与2到len之间的数相乘
ans[j]=num[j]*i;
for(j=0;j<len;j++) //循环处理进位
if(ans[j]>=10)
{
ans[j+1]+=ans[j]/10;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论