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; }
我基本上就是找出一些规律总结出了一些公式做出来的,过程有点麻烦,得静下心来仔细推敲,我先找的是递减的数,当n=1时,递减的有就是1到9这九个数字了,另外我开了一个数组,用来存放以1-9为开头的数字为递减数的数目,考虑过后就可以发现,n位数的递减数可以根据n-1位数求得,,,依次表示就行了,然后就是算递增数了,递增数可以由递减数求得,只是把一些含零的数字的数字和全部一样的数字去掉就行了(注意是全部一样的数才去掉),然后就是别忘了n位数的单调数是1位数到n位数的相加,最后想提醒的就是由于数字较大,要用到long long int哦,好了,不多说了,放代码了。
7791

被折叠的 条评论
为什么被折叠?



