不用long long int ,int足矣,直接用计算!!!!
开始只是一个简单的想法,在动手计算之后,终于找出了其中的规律,虽然不怎么简单,但只要大家认真看,还是会发现其中的奥妙的!!!!
根据题目的规律,在排到N后,总数字个数Sum=((N+1)*N)/2+((N-98)*(N-99))/2+((N-998)*(N-999))/2+((N-9998)*(N9999))/2+。。。
当然很容易计算,从1数到m的数字个数sum=m+(m-9)+(m-99)+(m-999)+。。。。。
还未说完全,见谅,但综上及代码,相信大家是看的懂的了,嘿嘿!!!!!!!!!
代码如下:
#include<stdio.h>
void main()
{
int i,j,n,m;
scanf("%d",&n);
for(i=0;i<n;i++)
{ int flag,k=0,sum=0,sumj=0,summ=0;
scanf("%d",&m);
for(j=1;j<=m;j++)
{ int k1=1,k2=1,k3=1,k4=1;
if(j-10<0) k1=0;
if(j-100<0)k2=0;
if(j-1000<0)k3=0;
if(j-10000<0)k4=0;
sumj=j+(j-9)*k1+(j-99)*k2+(j-999)*k3+(j-9999)*k4;
if(m-sum<=sumj)break;
sum=((1+j)*j)/2+((j-8)*(j-9)*k1)/2+((j-98)*(j-99)*k2)/2+((j-998)*(j-999)*k3)/2+((j-9998)*(j-9999)*k4)/2;
}
for(k=1;k<=m;k++)
{ int k1=1,k2=1,k3=1,k4=1;
if(k-10<0) k1=0;
if(k-100<0)k2=0;
if(k-1000<0)k3=0;
if(k-10000<0)k4=0;
summ=k+(k-9)*k1+(k-99)*k2+(k-999)*k3+(k-9999)*k4;
if(summ>=m-sum)break;
}
flag=summ-(m-sum);
if(flag==0)printf("%d\n",k%10);
if(flag==1)printf("%d\n",(k%100)/10);
if(flag==2)printf("%d\n",(k%1000)/100);
if(flag==3)printf("%d\n",(k%10000)/1000);
if(flag==4)printf("%d\n",k/10000);
}
}
虽然不是很好的方法,但见在敢于和大家分享,还请大家以后多多赐教哈!!!!新人也!!!!
本文介绍了一种通过计算找出特定数字序列中第N位数字的算法。该算法使用C语言实现,通过逐步累加的方式计算从1到N的数字序列,并能够定位到目标位数上的具体数字。

473

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



