legend

思考助我前行

给你这么个数列

给你这么个数列 
112123123412345123456123456712345678123456789123456789101234567891011... 
看出规律了吗 这个数列是由下列数列串合而成: 

12 
123 
1234 
12345 
123456 
1234567 
12345678 
123456789 
12345678910 
1234567891011 
12345678910... 
... 

现在问题是给定1 <=i <=2147483647 
要求此数列的第i位 
程序:
#include "stdio.h" #include "math.h"
/* 函数:weishu()
返回一个数的位数的函数
比如:  weishu(9)=1
        weishu(10)=2
        weishu(999)=3
        weishu(1000)=4
*/
int weishu(int arg)      
{
        
int i=0;
        
while(arg/(int)pow(10,(double)i))
            i
++;
        
return i;
}
//主函数
void main()
{
        
int a;
        
int s,k,i;    
        
while(1)        //循环测试结果
    {
        printf(
"please input i:");
        scanf(
"%d",&i);     //输入i值
        s=0;k=1;
        
/*以下是求i在第几行的算法,
        描述:以i为被减数开始依次减去每行的数字个数
        不难看出第K行的数字个数S(K)的表达式为:
        S(k)=S(k-1)+weishu(k)
        所以通过语句:s=s+weishu(k)循环k++就可以求得前k行的数字总个数。
        当i减到比当前的S(k)小的时候,即可确定第i个数字在k行
        
*/
       
while(i>(s=s+weishu(k)))
       {
        i
=i-s;
        k
++;
       }
       
/*以下是求第i个数包含在哪个数字中。
       比如 1,2,3,4,5,6,7,8,9,10,11是第11行,不难算出之前10行共有55个数。
       假如i是67,大家知道答案是10的倒数第一位,即是0.
       以下代码即可以计算出任意i在哪个数字的倒数第几位。
       算法描述:此时的i已经被递减为了目标数字在目标行的第几位。比如最初i是67,
       程序进行到这里时i已经为11了,表明目标数字是第11行的11个数字。
       这时让a从1开始递增,以i为被减数减去目标行前a个数所占的所有位数。
       直到i为0或者为负。为0则代表目标数字在此时a的最后一位,为-1则在倒数第二位,-2则倒数第三位,以此类推。
       
*/
       a
=0;
       
while(i>0)
       {
            a
++;
           i
=i-weishu(a);
          
       }
       
//打出目标数字在哪个数的倒数第几位
       printf("the result is %d de dao shu di %d wei/n",a,-i+1);
       
//简单的数字转换提取a倒数第几位的数字。如987的倒数第二位,为8。即为最终的目标数字。算法结束
       printf("the result is:%d/n",a/(int)pow((double)10,(double)(-1*i))%10);
    }
        
}
 
阅读更多
个人分类: algorithm
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭