算法入門-數學題之大數問題HDOJ1060&& HDOJ1061

1060:

題目大意:一組數據包含N個整數,整數範圍爲(1=<N<=1,000,000,000),但是題目要求是:求出N^N的最左邊數位的數字:例如 

2^2 是 4  answer=4    3^3 是 27  answer = 2  4^4 是256 answer = 2;

解題思路:由N的範圍可知用 32位的int 就足夠存儲。但是計算N^N就不能直接求解了,必須藉助 去對數方法 log 。

由對數性質:logN + logN = log(N*N) = 2logN; 那麼logN + logN…… logN (N個) = log(N*N*N……*N) = N*logN;

設 double x = N*logN  (x表示 10^x 即爲 N^N  但是損失後面位數精度的情況下表示N^N)   

設 double a = x - (int)x (減去x整數位留下小數位的含義就是,將N^N按照10進制向右移(int)x 位。剩下的整數位即位所求答案,然後通過取整獲得答案。

那麼:answer = (int)pow(10.0, a) 

至此總結完畢。

代碼如下:

//Time:15MS
//Mem :352K
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
	int t;
	cin>>t;
	for(int i=0;i<t;i++)
	{
		int n;
		cin>>n;
		double len = n*(log10(n*1.0));
		double ans = len - (long long int)len;
		cout<<(int)pow(10.0,ans)<<endl;
	}
	return 0;
}

1061

題目大意:類似1060,但是這次是讓求最右數位的值。

解題思路:由於只求個位的數字,而個位數字只跟個位有關,通過列表發現是一個週期爲4的規律。

代碼如下:

//注意考慮0的情況
//Time:15MS
//Mem :344K

#include <iostream>
using namespace std;

int main()
{
    int num;
    cin>>num;
    for(int i=0;i<num;i++)
    {
        int s;
        cin>>s;
        int t = s%10;
        if(s==0)
            cout<<1<<endl;
        else if(t==0)
            cout<<0<<endl;
        else if(t==1)
            cout<<1<<endl;
        else if(s%4==1)
            cout<<t<<endl;
        else if(s%4==2)
            cout<<(t*t)%10<<endl;
        else if(s%4==3)
            cout<<(t*t*t)%10<<endl;
	else if(s%4 == 0)
            cout<<(t*t*t*t)%10<<endl;
    }
    return 0;
}




 

發佈了25 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章