给你这么个数列
112123123412345123456123456712345678123456789123456789101234567891011...
看出规律了吗 这个数列是由下列数列串合而成:
1
12
123
1234
12345
123456
1234567
12345678
123456789
12345678910
1234567891011
12345678910...
...
现在问题是给定1 <=i <=2147483647
要求此数列的第i位
程序:
112123123412345123456123456712345678123456789123456789101234567891011...
看出规律了吗 这个数列是由下列数列串合而成:
1
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 );
}
}
/* 函数: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 );
}
}