机试常用算法和题型-大数专题

大数专题

字符加减关系,实现任意长度整数相加

#include 
#include 
using namespace std;
string Addition(string one, string two);
int main()
{
    int n, i;
    string first, second;
    cout << "Please enter two numbers: ";
    cin >> first >> second;
    cout << "The result is: " << Addition(first, second) << endl;
    //return 0;
    system("pause");
}
string Addition(string one, string two)
{
    int j, max;
    //分别表示第一,二个字符串的长度
    int flen, slen;
    string sum;
    flen = one.size();
    slen = two.size();
    if(flen >= slen)
    {
        sum = one;
        for(j=0;j=1;j--)
    {
        if(sum[j] > '9')
        {
            sum[j] -= 10;
            sum[j-1]++;
        }
    }
    if(sum[0] > '9')
    {
        sum[0] -= 10;
        sum = "1" + sum;
    }
    return sum;
}

大数加法,进阶转换版

#include 
#include 
#include 

using namespace std;

struct bign{
    int d[1000];
    int len;
    bign()
    {
        memset(d,0,sizeof(d));
        len=0;
    }
};

bign change(string s)
{
    bign a;
    a.len=s.size();
    for(int i=0;i>str1>>str2){
        bign a=change(str1);
        bign b=change(str2);
        bign c=add(a,b);
        for(int i=c.len-1;i>=0;i--){
            cout<

大数浮点数加法

#include 
#include 
#include 
using namespace std;
struct bign
{
    int d[110];
    int len;
    bign()
    {
        memset(d,0,sizeof(d));
        len=0;
    }
}big[110];
void change(char s[],bign &a,bign &b)
{
    int len=strlen(s),len1=0;
    for(int i=0;i=0;i--)
        a.d[len1-1-i]=s[i]-'0';
    b.len=len-len1-1;
    for(int i=len1+1;i(b.len-1)?(a.len-1):(b.len-1));i>=0;i--)
    {
        temp=a.d[i]+b.d[i]+carry;
        c.d[c.len++]=temp%10;
        carry=temp/10;
    }
    trans(c);
    while(c.d[c.len-1]==0&&c.len>=2)
        c.len--;
    return carry;
}
void add2(bign a,bign b,bign &c,int carry)
{
    int temp;
    for(int i=0;i=2)
        c.len--;
}
int main()
{
    char a[110],b[110];
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i=0;j--)
                printf("%d",e.d[j]);
            printf(".");
            for(int j=0;j

大数运算之阶乘

/*
题目描述
输入一个正整数N,输出N的阶乘。
输入描述:
正整数N(0<=N<=1000)
输出描述:
输入可能包括多组数据,对于每一组输入数据,输出N的阶乘
示例1
输入
n的阶乘简单写法,王道机试写得太复杂
*/

#include
#include
#include
using namespace std;
const int maxx = 5000;
int str[maxx];
void Cal(int n)
{
    for (int i = 0; i0)
        {   //此时的j已经到len+1了。新开辟的一个点,要不停的往前放
            str[j] = c % 10;
            j++;
            c /= 10;
        }
        //j就是当前最远的一位的位置
        len = j - 1;
    }
    //然后从逆开始输出!!,终于看懂了
    for (int j = len; j >= 1; j--)
        cout << str[j];
    cout << "\n";
}
int main()
{
    int n;
    while (cin >> n)
    {
        if (n == 0)printf("1\n");
        else Cal(n);

    }
}
//阶乘新写法
#include 
#include 
#include 

using namespace std;

int main()
{
    int n;
    while(cin>>n){
        int cnt[1001];
        int len=1;
        cnt[0]=1;
        for(int i=1;i<=n;i++){
            int carry=0;
            for(int j=0;j=0;i--){
            cout<

你可能感兴趣的:(机试常用算法和题型-大数专题)