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