给你这么个数列

给你这么个数列 
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 );
    }
        
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值