题解 | #数字阶梯求和#

数字阶梯求和

https://www.nowcoder.com/practice/c66df29f6c1c4dbba0bd51619210e082

//#include <endian.h>
#include<bits/stdc++.h>
#include <iostream>
using namespace std;
// 既要做精度乘 也要做精度加
// bug 做乘法的时候,重新声明了BIgInt  
// bug 在做加运算时,少算了carr. 
struct BigInt
{
    int len ; 
    int d[1000] ; 
        BigInt()
    {
        memset(d , 0 , 1000) ; 
        len = 0 ;
	
		 
    }
    BigInt(int a)
    {
        memset(d , 0 , 1000) ; 
        len = 0 ;
		while(a != 0)
		{
			d[len++] = a%10 ; 
			a = a/10 ; 
		 } 
		 
    }
	
    BigInt operator*(const int &  a)
    {
        BigInt res ; 
        int carr = 0 ; 
        int i = 0 ; 
        // cout<<this->len ; 
        
        while( i < len ) // 当i 
        {
            res.d[i] =( carr +d[i] * a)%10;  
            carr = d[i] * a /10 ;
            i++ ;  
        }      
        if(carr !=0)
        {
            res.d[i++] = carr ; 
        }
        res.len = i;
        return res ; 
    }
    BigInt operator+(BigInt biga )
    {
        //加法
        int carr  = 0 ; 
        BigInt res ; 
        int i = 0 ; 
        while(i< len && i < biga.len)
        {
            res.d[i] = (carr + d[i] + biga.d[i]) %10;
            carr = (carr + d[i] + biga.d[i] ) /10 ; 
            i++ ; 
        }
        while(i < len)
        {
            if(carr != 0)
            {
                res.d[i] =  (carr + d[i]) %10 ; 
                carr = (carr + d[i]) /10 ; 
                 i++ ; 
            }
            else {
                res.d[i] = d[i] ; 
                i++ ;  
            }
        }
        while(i < biga.len)
        {
            if(carr != 0) // 如果carr不为0,那么就继续 
            {
                res.d[i] =  (carr + biga.d[i]) %10 ; 
                carr = (carr + biga.d[i]) /10 ; 
                i++ ; 
            }
            else {
                res.d[i] = biga.d[i] ; 
                i++ ;  
            }
        }
        if(carr != 0)
        {
            res.d[i++] = carr;
        }
        res.len = i; 
        return res ; 
    }
   BigInt   operator=(BigInt& a)
    {

        len=a.len ; 
        for(int i =0 ; i < len ; ++ i)
        {
            d[i] = a.d[i] ; 
        } 
        // a.len= 0 ; 
        // memset(a.d, 0 , a.len ) ; 
        return *this ; 
    }
    BigInt   operator=(BigInt&& a)
    {
        len=a.len ; 
        for(int i =0 ; i < len ; ++ i)
        {
            d[i] = a.d[i] ; 
        } 
         a.len= 0 ; 
         memset(a.d, 0 , a.len ) ; 
        return *this ; 
    }
    BigInt(const BigInt & a )
    {
    	memset(d, 0 , 1000)  ; 
        len = a.len ; 
        for(int i =0 ; i < a.len ; ++ i )
        {
            d[i] = a.d[i] ; 
        }
    }
        BigInt(const string & s )
    {
        len = 0 ; 
        memset(d , 0 , 1000) ; 
		for(int i = s.size()-1 ; i >= 0 ; --i )
		{
			d[len++] = s[i]  - '0';  	
		}
    }
}; 
int main() {
    int a ; 
    int n ; 
    while(cin>>a>>n)
    {
        int t = 1; 
       
        // cout<<"it.len"<<it.len<<endl ; 
        vector<BigInt> rtmp; 
        char c = '0' + a ; 
        string s  ; 
        s.clear() ; 
        
        for(int i = 0 ; i < n ; ++ i)
        {   
            s+=c ; 
			BigInt it(s);
            // cout<<endl ; 
             
            rtmp.push_back(it) ; 
            
        }
        // cout<<"rtmp.size()"<<rtmp.size()<<endl ;
        BigInt res(0) ; 
        for(int i = 0 ; i <rtmp.size() ; ++i)
        {
            res = (res + rtmp[i ] ) ;   
        }
        for(int i =res.len -1  ; i >= 0 ; i-- )
        {
            cout<<res.d[i]; 
        }
        cout<<endl ; 
    }   
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

11-05 07:29
贵州大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务