Loading

C++ atoi函數的實現

2011年9月16日 15:28

以前我曾經發過C++ itoa函數的實現,現在發C++ atoi函數,為即將參加NOIP的同學們做貢獻。
 
本文轉載自http://blog.csdn.net/serine/article/details/2154377,但是他的代碼有個致命的錯誤,運行後程序會崩潰的,我已經將其改正。
int myatoi(char *str)
{
	int ret=0;
	int sign=1;
	if(*str=='-')
		sign=-1;
	else
		ret=ret*10+(*str-'0');
	str++;
	
	while(*str!= '\0')
	{
		ret=ret*10+(*str-'0');
		str++;
	}
	return sign*ret;
}

 

Tags: c++ 函數
评论(0) 阅读(1183)

高精度加法 完全的函數封裝!

2011年9月14日 02:37

高精度計算是NOIP中常考常用的算法之一,某天我閑的DT,寫了個代碼極其冗長的高精度加法函數,方便大家直接調用。

#include <iostream>
#include <string>
using namespace std;

char result[100];

void Highj(char a[],char b[])
{
    int x[100],y[100];
    int i,l,la,lb;
    char temp[100];
    for (i=0;i<99;i++){x[i]=0;y[i]=0;} //初始化
    la=strlen(a);
    lb=strlen(b);
    
    //把char型數組 按正倒序  變成整型數組
    if (la<=lb)
    {
        for (i=la-1;i>=0;i--)
            y[i]=a[la-1-i]-'0';
        for (i=lb-1;i>=0;i--)
            x[i]=b[lb-1-i]-'0';
        l=la;
    }
    else 
    {
        for (i=la-1;i>=0;i--)
            x[i]=a[la-1-i]-'0';
        for (i=lb-1;i>=0;i--)
            y[i]=b[lb-1-i]-'0';    
        l=lb;        
    }
    
    //執行加法運算
    for (i=0;i<l;i++)
    {
        x[i]=x[i]+y[i];
        if (x[i]>=10) 
        {
            x[i]-=10;
            x[i+1]+=1;
        }
    }
    
    //再把整型數組按照倒序轉換成char型數組
    for (i=99;i>=0;i--)
        temp[99-i]=x[i]+'0';
    
    //從不是0的一位開始輸出結果
    for (i=0;i<=99;i++)
    {
        if (temp[i]>'0')
        {
            for(int j=i;j<=99;j++)
                result[j-i]=temp[j];
            return;
        }
    }
    
    //如果沒有一位大於0
    result[0]='0';
    return;
}

int main()
{
    char a[100],b[100];
    cin>>a>>b;
    Highj(a,b);
    cout<<result<<endl;
    return 0;
}

Tags: c++ 函數 算法
评论(1) 阅读(1230)

高精度乘法 完全的函數封裝!

2011年9月14日 02:21

高精度計算是NOIP中常考常用的算法之一,剛才把我們班康運澤同學寫的高精度乘法要了過來,改成了完全的封裝函數,貼了出來。

代碼如下:

#include<fstream>
using namespace std;
ifstream fin("mul.in");
ofstream fout("mul.out");
int e[220]={5};

int gjdcf(char *mul,char *mul2)
{
    int i,j,lq,lw,q[110],w[110],temp;
    lq=strlen(mul);
    for (i=0;i<lq;i++)
    {
        q[lq-1-i]=mul[i]-'0';
    }

    lw=strlen(mul2);
    for (i=0;i<lw;i++)
    {
        w[lw-1-i]=mul2[i]-'0';
    }

    if (lq<lw)
    {
        for (i=0;i<lw;i++)
        {
            temp=q[i];
            q[i]=w[i];
            w[i]=temp;
        }
        temp=lq;
        lq=lw;
        lw=temp;
    }
    for (i=0;i<(lq+lw+1);i++)
    {
        e[i]=0;
    }
    for (i=0;i<lw;i++)
    {
        for (j=0;j<lq;j++)
        {
            if ((e[j+i-1]>=10)&&((j+i-1)>=0))
            {
                e[j+i]=e[j+i]+e[j+i-1]/10;
                e[j+i-1]=e[j+i-1]%10;
            }
            if ((w[i]*q[j])<10)
            {
                e[j+i]=(w[i]*q[j])+e[j+i];
            }
            if ((w[i]*q[j])>=10)
            {
                e[j+i+1]=(w[i]*q[j])/10+e[j+i+1];
                e[j+i]=(w[i]*q[j])%10+e[j+i];
            }
            if ((e[j+i])>=10)
            {
                e[j+i+1]=e[j+i]/10+e[j+i+1];
                e[j+i]=e[j+i]%10;
            }
        }
    }

    return lq+lw;
}

void print(int p)
{
    int i;
    if (e[p-2]==0)
    {
        fout<<0;
    }
    else
    {
        if ((e[p-1]==0)&&(e[p-2]!=0))
        {
            for (i=p-2;i>=0;i--)
            {
                fout<<e[i];
            }
        }
        else
        {
            for (i=p-1;i>=0;i--)
            {
                fout<<e[i];
            }
        }
    }
}

int main()
{
    char aa[101],bb[101];
    fin>>aa>>bb;
    print(gjdcf(aa,bb));
    return 0;
}

Tags: C++ 算法 函數
评论(0) 阅读(1050)