1. 程式人生 > >統計數字問題演算法

統計數字問題演算法

簡述:就是你輸入一個頁數,檢視從1到你輸入的這一頁,0到9個出現的次數。

有兩種演算法:(根據需要而定)

(1)使用計數,即:用一個for迴圈語句和一個while來統計這幾個數出現的次數

他使用簡單,容易理解,但是效率太低,對於一個小整數而言,他是很好的一個算嗎,但是對於一個100萬以上的數,他的時間往往讓人無法等待,百萬的數就是幾秒中。而千萬級的數,就是幾十秒甚至幾分鐘,,上億時,他的時間就是3或4分鐘。程式碼如下:

public static void tongji1()
	{
		int []tongji=new int[10];
		Scanner scanner=new Scanner(System.in);
		long yema=scanner.nextLong();
		long j1=System.currentTimeMillis();
		for(int i=1;i<=yema;i++)
		{
			int temp=i;
			while(temp>0)
			{
				int n=temp%10;
				tongji[n]++;
				temp/=10;
			}
		}
		long j2=System.currentTimeMillis();
		System.out.println(j2-j1);
			
	}

(2)他不再同二重迴圈了,因為i她的時間複雜度太高了,(N方),而他的時間複雜度較低。

他不容易理解,但是效率高,程式碼長,他計算一個上億的,就是不再是用毫秒單位計算了,往往使用微妙,上衣的就是幾百圍標,相當於0毫秒,

程式碼如下:

public static void tongji2()
	{
		int []tongji=new int[10];
		Scanner scanner=new Scanner(System.in);
		long yema=scanner.nextLong();
		long j1=System.currentTimeMillis();
		int len=0;//計算她的長度-1
		long temp=yema;
		//將設頁碼是從0開始,並且前面有多餘的0,以你輸入的為主:990:000-990
		tongji[0]=-1;
		while(temp>=10)
		{
			len++;
			//減去多餘的0
			tongji[0]-=Math.pow(10, len);
			temp/=10;
		}
		jsshu(tongji, len, yema);
		long j2=System.currentTimeMillis();
		System.out.println(j2-j1);
		System.out.println(Arrays.toString(tongji));
	}
	
	public static void jsshu(int []a,int len,long yema)
	{
		if(yema<10)
		{
			for(int i=0;i<=yema;i++)
			{
				a[i]++;
			}
			return;
		}
		else
		{
			//10的幾次放
			long zuida=(long) Math.pow(10, len);
			//統計你輸入的輸的0-9基本變化量,公式:(len-1)*10^(len-2)
			long bhl=(long) (len*zuida/10);
			int max=(int) (yema/zuida);
			long yushu=yema%zuida;
			for(int i=0;i<max;i++)
			{
				a[i]+=zuida;
			}
			for(int i=0;i<10;i++)
			{
				a[i]+=max*bhl;
			}
			if(yushu==0)
			{
				a[0]+=len;
				a[max]++;
			}
			else
			{
				int l=0;
				//餘數,有沒有少加0;例如70001,餘數1,他中間的令就沒有價
				while((zuida/=10)>yushu)
				{
					l++;
				}
				a[0]+=(l*(yushu+1));
				a[max]+=(yushu+1);
				jsshu(a, len-l-1, yushu);
			}
		}
	}
有什麼問題,提出來。能力有限。見諒

相關推薦

NOI2.4基本演算法之分治 統計數字 分析----換一種思路

一、題目描述 總時間限制: 1000ms 記憶體限制: 65536kB描述 某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5*109)。已知不相同的數不超過10000個

統計數字問題-演算法實現(暴力統計法)

這是一個暴力統計法對數字問題的演算法實現。 在編輯程式碼的過程中遇到了if語句在進行每個數字的分拆時遇到了1的個數缺少的問題,其最高為的1的個數缺少統計。 經過查明是因為if的使用只是基於判斷使用,而我的程式碼中要使用到的是迴圈計數。因而要使用while來實現迴圈。 下面

演算法設計與分析: 1-1 統計數字問題

1-1 統計數字問題 問題描述 一本書的頁碼從自然數1 開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排, 每個頁碼都不含多餘的前導數字0。例如,第6 頁用數字6 表示,而不是06 或006 等。數 字計數問題要求對給定書的總頁碼n,計算出書的全

統計數字問題演算法

簡述:就是你輸入一個頁數,檢視從1到你輸入的這一頁,0到9個出現的次數。 有兩種演算法:(根據需要而定) (1)使用計數,即:用一個for迴圈語句和一個while來統計這幾個數出現的次數 他使用簡單,容易理解,但是效率太低,對於一個小整數而言,他是很好的一個算嗎,但是對於一

統計數字問題[演算法設計與分析]

/* * NumberCount.cpp * Author: MagicYun */ #include <cstdio>#include <cstdlib>#include <iostream> using namespace std; i

演算法設計之補零遞迴法(統計數字問題)

問題:給定一個數N求從1到N的這N個數中0,1,2,3,4,5,6,7,8,9這10個數字出現的次數。注意,所有的數字沒有前導的0。 如6要寫成6,而不是 006 ,06這種形式 思路1:也就是最簡

演算法-------統計數字問題

統計數字問題 一本書的頁碼重自然數1開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排,每個頁碼都沒有多餘的前導數字0。 要求,給一個輸入檔案,統計他的頁碼(為了方便起見,假定每一行為一頁)。 然後,計算出書的全部頁碼用了多少次0,1,2,3...9。 最後將結果儲存至

【LintCode: 3. 統計數字演算法題解析

開發十年,就只剩下這套架構體系了! >>>   

【C語言】統計數字在排序數組中出現的次數

語言 個數 統計 ret r+ () class tdi times //數字在排序數組中出現的次數。 //統計一個數字在排序數組中出現的次數。比如:排序數組{1,2,3,3,3,3,4,5}和數字3,因為3出現了4次,因此輸出4. #include <stdio

[luoguP1097] 統計數字(水)

ostream nbsp org urn tchar return blog print main 傳送門 這麽水的題,也只有提高組第一題了吧 代碼 #include <cstdio> #include <iostream>

luogu P1097 統計數字

font for -1 string name int esp space light 題目描述 某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5*10^9)。已知不相同的數不超過10000個,現在需要統計這些自然

洛谷—— P1097 統計數字

noi target targe print include else show class http https://www.luogu.org/problem/show?pid=1097 題目描述 某次科研調查時得到了n個自然數,每個數均不超過1500000000(

統計數字

統計 clu show 提示 自然 http esp clas ++ 鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1239 時間限制: 1000 ms 內存限制: 65536 KB 【題目描述】

常用統計數字特征及解析工具

log 隨機變量 函數定義 泊松分布 相關 blog 數值 我們 直接 母函數 母函數定義 考慮只取非負值的離散型隨機分布,如二項分布,泊松分布,幾何分布等,稱之為整值隨機變量。而有一種變換方法比較適於變換,即母函數法。 對於整值隨機變量 \(\xi\) ,根據佚名統計學家

題:統計數字出現次數。 隨機生成100個數字數字範圍從1到10,統計每個數字出現的次數並打印到控制臺。

pre 方向 system 繼續 void pub arr static 遍歷 public static void main(String[] args) { printCount(getNumList());}private static ArrayList&l

Uva1640(統計數字出現的次數)

還要 eof ring size set include algorithm swa ios 題意: 統計兩個整數a,b之間各個數字(0~9)出現的次數,如1024和1032,他們之間的數字有1024 1025 1026 1027 1028 1029 1030 1031 1

統計數字問題(10^9的大數)

問題描述:一本書的頁碼從自然數1 開始順序編碼直到自然數n。書的頁碼按照通常的習慣編排, 每個頁碼都不含多餘的前導數字0。例如,第6 頁用數字6 表示,而不是06 或006 等。數 字計數問題要求對給定書的總頁碼n,計算出書的全部頁碼中分別用到多少次數字0,1, 2,…,9。 資料輸入

IP地址轉換成Long型數字演算法和原理(全網最細!!)

將ip地址轉換成數字地址的時候是我做一個歸屬地查詢的專案是碰見的,開始我並不明白將IP轉換成數字地址的原理,可能老師上課講了但是沒有好好聽,我覺得想理解下面演算法就應該理解IP地址和數字地址的原理(菜鳥專用(^_^)) IP地址一般是一個32位的二進位制數意思就是如果將IP地

NOIP2007統計數字(提高組T1)————STL

題解:本題資料較大,一些排序演算法不可行。因此用sort便是很好的方法。 程式碼如下: #include<iostream> #include<algorithm> using namespace std; int a[222222]