POJ 1001 Exponentiation
  高精度数的计算, 以前在网上看到过一个计算大数阶乘比如10000000!的算法, 总体思想就是将结果用数组保存起来, 然后将结果的每一位与乘数相乘, 当然还有进位...
  有了这个算法的思想, 这个题思路就可以是:先将输入的小数转换成一个整数, 当然这个整数肯定能够用int类型的变量保存, 比如1.2345, 通过函数 removeDot()将它转化成12345 然后利用大数阶乘的思想计算*12345, 最后的就是输出了, 这个要考虑的情况比较多, 因为这个也WA5次才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
题意:输入一个数,要求判该数是否为循环数.
      依次将该数分别于2len(输入的数的位数)相乘,在乘的过程中,判断数发生了变化没有,如果发生了变化,则直接输出该数不是循环数,没有必要再继续乘下去,而如果是循环数,则一直需
要乘下去.
#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++)                                                    //依次将该数与2len之间的数相乘
                ans[j]=num[j]*i;
            for(j=0;j<len;j++)                                                    //循环处理进位
                if(ans[j]>=10)
                {
                    ans[j+1]+=ans[j]/10;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。