首页 > 试题广场 >

无限长正整数排列字符串

[编程题]无限长正整数排列字符串
  • 热度指数:8440 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}定义无限字符串 S=\texttt{,即将所有正整数依次拼接得到。
\hspace{15pt}珂朵莉想知道该字符串的第 n 个字符是什么。

输入描述:
\hspace{15pt}在一行中输入一个整数 n \left(1 \leqq n \leqq 1000\right)


输出描述:
\hspace{15pt}输出一个数字,表示字符串 S 的第 n 个字符。
示例1

输入

3

输出

3

说明

n=3 时,S=\texttt{,其第 3 个字符为 \texttt{'3'}
示例2

输入

11

输出

0

说明

n=11 时,S=\texttt{,其第 11 个字符为 \texttt{'0'}

备注:

n = int(input())
s = ''.join([str(i) for i in range(1,501)])
print(s[n-1])
# 这就是py吗

发表于 2025-06-18 23:07:53 回复(0)
#include <stdio.h>
#include <string.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    char num1[2000]="";
    char num2[1000]={0};
    for(int i=1;strlen(num1)<n;i++)
    {
        sprintf(num2,"%d",i);
        strcat(num1,num2);
    }
    printf("%c",num1[n-1]);
    return 0;
}
楼主太菜了,改了好几次。第一个是要注意他的拼接方式,一开始楼主理解为只是那个给出的15个字符无线循环最后肯定错了,他是1   2  ……11  12  13 这么拼接的;第二个,将整数转化为字符的形势需要用sprintf这个函数;第三,最后输出结果那块,之前直接写在了循环里面,if(strlen(num1)==n),忽视了他拼接后很有可能超出n这个情况,最后把printf放在外面,直接输出解决(还是条件理解的不深刻)
希望写的这些有所帮助。
发表于 2025-12-09 09:39:46 回复(1)
#include <iostream>
#include <string>
using namespace std;

int findNthDigit(int n) {
    int digit = 1;      // 当前数字的位数
    long start = 1;     // 当前位数范围的起始数字
    long count = 9;     // 当前位数范围的数字总字符数
    
    // 1. 确定数字的位数
    while (n > count) {
        n -= count;
        digit += 1;
        start *= 10;
        count = 9 * start * digit;
    }
    
    // 2. 确定具体的数字
    long num = start + (n - 1) / digit;
    
    // 3. 确定数字中的具体字符
    return to_string(num)[(n - 1) % digit] - '0';
}

int main() {
    int n;
    cin >> n;
    cout << findNthDigit(n) << endl;
    return 0;
}

发表于 2025-07-16 13:54:15 回复(0)
#include <iostream>
using namespace std;
//数学方法
int main() {
int a;
cin >>a;
//9
//9+2*90 189
//9+2*90+3*
if(a<=9) cout<<a;
else if(a<=9+2*90){
int times,left,num;
times = (a-9)/2;
left = (a-9)%2;
num = 9+times+left;
if(left==0) cout<<num%10;
else cout<<num/10;
}else{
int times,left,num;
times = (a-9-2*90)/3;
left = (a-9-2*90)%3;
num = 9+90+times;
if(left>=1) num++;
if(left==0) cout<<num%10;
else if(left==1)cout<<num/100;
else cout<<num/10%10;
}
}
// 64 位输出请用 printf("%lld")
发表于 2025-11-22 18:28:16 回复(0)
n = int(input()) - 1
s = ""
for i in range(1, 1001):
    s += str(i)
print(s[n])

发表于 2025-11-06 14:30:50 回复(0)
n = int(input()) -1

a = ""
for i in range(1,1001):
    a += str(i)

print(a[n])


暴力美学

发表于 2025-09-05 21:27:12 回复(0)
#include <stdio.h>
#include <string.h>
int main() {
    int n;
    char s[5000] = "";
    scanf("%d", &n);
    for (int i = 1; ; i++) {
        char number[5];
        sprintf(number, "%d", i);
        strcat(s, number);
        if (i == n) {
            printf("%c", s[n - 1]);
            break;
        }
    }
    return 0;
}

发表于 2025-12-17 16:13:14 回复(0)
#include <stdio.h>

int main() {
    int n=0;
    scanf("%d",&n);
    if(n<=9)
    {
        printf("%d",n);
    }
    else if(n<=189)    //在两位区间
    {
        int pos=n-9;
        int num=10+(pos-1)/2; //数字的序号
        int ret=(pos-1)%2;    //在一个数字中的位置,为0就是最高位,1第二位
        if(ret==0)
            printf("%d",num/10);
        else 
            printf("%d",num%10);
    }
    else {              //在三位区间
        int pos=n-189;
        int num=100+(pos-1)/3;
        int ret=(pos-1)%3;
        if(ret==0)
            printf("%d",num/100);
        else if(ret==1)
            printf("%d",num/10%10);
        else
            printf("%d",num%10);
    }
    return 0;
}

发表于 2025-11-29 15:06:32 回复(1)
s = []
i = 0
n = int(input())
while i<=n:
    i += 1
    s.append(i)
ss = list("".join(map(str,s)))
print(ss[n-1])

发表于 2025-11-24 21:41:12 回复(0)
#include <stdio.h>
void ***(int n,int ret[])
{
    int tmp,count=0,arr[10];
    for(int i=0;n!=0;i++)
    {
        arr[i]=n%10;
        n=n/10;
        count++;
    }
    count--;
    for(int j=0;count>=0;j++,count--)
    {
        ret[j]=arr[count];
    }
}
int main() {
    int n,t;
    scanf("%d",&n);
    int arr[1000],ret[10];
    for(int m=0;m<10;m++)
    {
        ret[m]=-1;
    }
    for(int i=0,j=1;i<1000;j++)
    {
        if(j<10)
        {
            arr[i]=j;
            i++;
        }
        else
        {
           ***(j,ret);
           for(int u=0;ret[u]!=-1;u++)
           {
            arr[i]=ret[u];
            i++;
           }
        }
    }
    printf("%d",arr[n-1]);
    return 0;
}
发表于 2025-11-24 20:46:50 回复(0)
#include <iostream>
#include <string>
using namespace std;

int main()
{
    size_t n; cin >> n;
    string S;
    for(int i = 1; S.length() < n; ++i)
        S += to_string(i);
    cout << S[n-1] << endl;
    return 0;
}
发表于 2025-11-20 11:39:58 回复(1)
n = int(input())
s = ""
for i in range(1,n+1):
    s = s+str(i)
print(s[n-1])

发表于 2025-11-18 15:46:50 回复(0)
/* 贴一个java版的 */

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int begin = 1; // 判断 n 最后落在哪个数中了
        int len = (int) Math.log10(begin) + 1;
        while (n > len) {
            n -= len;
            len = (int) Math.log10(++begin) + 1;
        }
        System.out.println(Integer.toString(begin).charAt(n - 1));
    }
}
发表于 2025-11-08 18:17:40 回复(0)
n = int(input())
[s, i] = [0,1]
while True:
    if (n - s) <= len(str(i)):
        print(str(i)[n-s-1])
        exit()
    s = s + len(str(i))
    i += 1

发表于 2025-11-07 19:27:38 回复(0)
#include <stdio.h>

int main() {
    int n, c;
    scanf("%d", &n);

    /*以下方法可以修改,
    用循环确定n对应的数字位数及n属于数字第几位再用过公式计算字符,
    并封装为函数免去if判断的繁杂*/

    //从零开始编号,编号0字符是'0';
    //编号n是单位数字符
    if (n < 10) c = n;
    //双位数字符
    else if ( n < 90 * 2 + 10){
        n -= 10;//减去单位数的字符数,使双位数重新从零开始编号
        //编号n是双位数中十位的字符
        if( n % 2 == 0) { c = n/20 + 1; }//20字符(10个数字 * 2 字符每个数字)一组,第零组是十
        //编号n是个位的字符
        else c = n/2%10;//2字符(个位1个数字 * 2 字符每个数字)一组,第零组是0,10组一循环故取模10
    }
    //三位数的字符
    else if ( n < 900 * 3 + 90 *2 + 10){
        n -= (90 * 2 + 10);//减去前面的字符数,使三位数字符从零开始编号
        //百位字符
        if( n % 3 == 0) {c = n/300 + 1;}//(100个数字 * 3字符每个数字)一组,第零组是一百
        //十位
        else if( n % 3 == 0 ) { c = n/30%10;}
        //个位
        else { c = n/3%10;  }
    }


    printf("%d", c);
    return 0;
}

发表于 2025-11-03 23:52:29 回复(0)
#include <stdio.h>
#include <math.h>

int main()
{
    int n;
    scanf("%d", &n);

    int k = 1;      // 当前数字的位数
    long long count = 9; // k 位数的总字符数(初始为 1 位数)

    // 1. 确定 n 所在的数字位数 k
    while (n > k * count) {
        n -= k * count;
        k++;
        count *= 10;
    }

    // 2. 计算具体的数字
    long long num = pow(10, k - 1) + (n - 1) / k;

    // 3. 找到数字中的第 m 位
    int m = (n - 1) % k;
    char digit = (num / (long long)pow(10, k - m - 1)) % 10 + '0';

    printf("%c\n", digit);
    return 0;
}
发表于 2025-10-14 16:41:32 回复(0)
#include <iostream>
#include <sstream>  
using namespace std;

int main()
{
    long int n;
    cin>>n;
    stringstream str1;
    string str2;
    for (int i=1;i<=500;i++)
    {
    str1 << i;
    }
    str2=str1.str();
    cout<<str2[n-1];
    return 0;
}//用dev运行,vs运行会报错:D
发表于 2025-10-13 13:26:46 回复(0)
//纯数学计算方法
#include <cstdio>
int main(){
    int n;
    scanf("%d",&n);
    if(n<=9) {printf("%d",n);return 0;}//记一位数字
    else if(n<=189) {if(n%2==0) printf("%d",(n-10)/20+1);
    else printf("%d",(n-11)/2%10);return 0;}//记二位数字(9+2*10*9=189)
    else {if (n%3==1) printf("%d",(n-190)/300+1);
            else if (n%3==2) printf("%d",(n-191)/30%10);
            else printf("%d",(n-192)/3%10);//记三位数字(189+3*100*9=2889>1000,无需再分类)
            return 0;}
}
发表于 2025-10-08 16:47:18 回复(0)
n=int(input())
i=0
result=[]
a=1
while i <10000:
    result += str(a)
    a+=1
    i+=1
print(result[n-1])
发表于 2025-09-28 16:32:56 回复(0)
a = int(input())
l1 = []
for i in range(1,a+1):
    l1.append(i)
s = ''.join(map(str,l1))
print(s[a-1])
发表于 2025-09-28 14:55:36 回复(0)