BIT2014級軟件學院程序設計-10 ⑨的統計

衆所周知,琪露諾(チルノ,Cirno)是幻想郷 (げんそうきょう)中首屈一指的天才,可以說⑨就是她的代名詞。

然而如今,她遇到了一個和⑨有關的難題。你能幫助她麼?

題目是這樣的,給出兩個數 a 和 b (0 <= a <= b <= 10^10000),求 a 到 b 之間(包括a和b)的數字中,有多少個數字是包含9的(例如 19,910 等都是包含9的數字)。

輸入

第一行爲一個數字 T (0 < T <= 100) 表示數據組數。

之後的 T 行,每行包含兩個數 a 和 b (0 <= a <= b <= 10^10000)。

輸出

對每組數據輸入,輸出一個數字,表示 a到 b 之間的數字中(包括a和b),有多少個數字是包含9的。(注意:答案可能很大)

Sample Input

2

0 9

0 100

Sample Output

1

19

感覺基本應該是程設最難的一道題了把,我感覺是。

先轉化成求0-a和0-b有多個數字9

數量很大要用到高精度。用數組來存數字。

然後比如13012958就是求10000000的9+3000000的9+10000的9+2000的9+958

至於10000000有多少個9就可以直接用公式了。

10:1;100:1*9+10=19;1000:19*9+100;...........................................

然後計算高精度注意一些東西就好了,比如壓縮一下位數,還有應用一下秦九韶公式就好

#include<stdio.h>
#include<string.h>
#define	mod 100000000
#define maxn 10080
#define end 1300
char a[maxn];
char b[maxn];
int num[maxn];
int ans[3][end+2];//答案數組

void big_sum(int *a1, int ak)
{
	int i, k=0;
	a1[end] += ak;
	for(i=end;i>=0;i--)
	{
		if(a1[i]>=mod)
		{
			a1[i]-=mod;
			a1[i-1]++;
		}
		else break;
		//if(a1[end]>mod)
		//a1[end]-=mod;
		//a1[end-1]++;//爲了節省時間複雜度沒有用循環,不夠嚴謹,可能全是999999999需要進位
}
	return;
}

void big_cheng(int *a1,int ak)
{

	int i, k;
	int j=0;
	while(!a1[j])
	j++;//j是第一位非0
	for (i = end;i>=j;i--)
		a1[i] *= ak;
	//a1[0] *= ak;
	k = 0;
	for (i = end;i>=j-2;i--)//進位
	{
		a1[i] += k;
			k = a1[i] / mod;
		a1[i] = a1[i] % mod;
	}
	return;
}
void big_jian(int *a1, int *a2, int *a3)
{
	int i;
	for (i = end;i >= 0;i--)
	{
		a1[i] = a2[i] - a3[i];
	}
	for (i = end;i >0 ;i--)
	{
		if (a1[i] < 0)
		{
			a1[i -1]-=1;
			a1[i] += mod;
		}
	}
	return;
}

void search_9(int length,int flag)//flag爲0 是第一個數,1是第二個數
{//利用秦九韶算法
	int i;
	int flag9=0;
int ans1[end+5]={0};
int ans2[end+5]={0};
		ans1[end]=num[0];

		ans2[end]=num[0];
		if(num[0]==9)//判斷9
		flag9=1;
	for (i = 1;i < length;i++)
	{

		big_cheng( ans1,10);//高精度乘法
		big_sum(ans1, num[i]);//高精度加法

		if (flag9)
		{
			big_cheng(ans2, 9);
		}
		else {
			big_cheng(ans2, 9);
			big_sum(ans2, num[i]);
		}
		if(num[i]==9)
		flag9=1;
	}
	big_jian(ans[flag],ans1, ans2);
	return;
}
int main()
{
	//freopen("F:in.txt","r",stdin);
//	freopen("F:out1.txt","w",stdout);

	int T;
	int la, lb;
	int i, j,flag2;
	scanf("%d", &T);
	while(T--)
	{
		flag2 = 0;
	//	memset(ans,0,sizeof(ans));
	//	memset(num,0,sizeof(num));
		scanf("%s%s", a, b);
		la = strlen(a);lb = strlen(b);
		for (i = 0;i < la;i++)
		{
			num[i] = a[i] - '0';


		}search_9(la, 0);
	//	memset(num,0,sizeof(num));
		for (i = 0;i < lb;i++)
		{
			num[i] = b[i] - '0';
			if (num[i] == 9)
				flag2 = 1;
		}

		search_9(lb,1);
		big_jian(ans[2], ans[1], ans[0]);
		ans[2][end] = ans[2][end] + flag2;

			for(i=end;i>=0;i--)
		{
			if(ans[2][i]>=mod)
			ans[2][i-1]++;
			else break;
		}


		for (i = 0;i <= end;i++)
		{
			if (ans[2][i])
				break;
		}
		printf("%d", ans[2][i]);
		i++;

		while (i <= end)
		{

			printf("%08d", ans[2][i]);
			i++;
		}
		printf("\n");
	}
	return;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章