zzuoj1196单调数


Description
对于一个正整数x,如果x的每一位都不大于它右边一位上的数字,那么就称x是递增数,例如:112,4557,18899,111。

类似的,如果x的每一位都不小于它右边一位上的数字,那么就称x是递减数,例如:986,6331,77311,111。

递增数和递减数统称单调数。(111既是递增数,也是递减数,所以111肯定是单调数)

Input
有多组输入。

每组输入一个数n。(n<=100)

Output

6

10


Sample Output

12951
277032

这道题完全就是个数学题啊,抓狂我基本上就是找出一些规律总结出了一些公式做出来的,过程有点麻烦,得静下心来仔细推敲,我先找的是递减的数,当n=1时,递减的有就是1到9这九个数字了,另外我开了一个数组,用来存放以1-9为开头的数字为递减数的数目,考虑过后就可以发现,n位数的递减数可以根据n-1位数求得,,,依次表示就行了,然后就是算递增数了,递增数可以由递减数求得,只是把一些含零的数字的数字和全部一样的数字去掉就行了(注意是全部一样的数才去掉),然后就是别忘了n位数的单调数是1位数到n位数的相加,最后想提醒的就是由于数字较大,要用到long long int哦,好了,不多说了,放代码了。
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
unsigned long long int a[10],b[10];
unsigned long long int sum,sum1,sum2;
int main()
{
	int n,i,j;
	while(scanf("%d",&n)!=EOF)
	{
		sum=9;
		for(i=0;i<10;i++)
			{
			a[i]=1;
			b[i]=0;
		    }
		sum1=9;
		sum2=0;
		for(j=1;j<n;j++)
		{
			for(i=1;i<10;i++)
			{
			if(i==1)
			{
				a[i]=sum1-a[2]-a[3]-a[4]-a[5]-a[6]-a[7]-a[8]-a[9]+1;
				b[i]=sum2-b[2]-b[3]-b[4]-b[5]-b[6]-b[7]-b[8]-b[9]+1;
			}
			else
			{
				a[i]=a[i-1]+a[i];
				b[i]=b[i]+b[i-1];
			}
		    }
		sum1=sum2=0;
		for(i=1;i<10;i++)
		   {
			sum1=sum1+a[i];
			sum2=sum2+b[i];
		   }  
		  sum=sum+sum1+sum1-sum2-9;
		}
		 if(n==1)
		 	sum=sum1+sum1-sum2-9;
		 printf("%lld\n",sum);	
	} 
	return 0;
}



你可能感兴趣的:(zzuoj1196单调数)