首页 > 试题广场 >

无限长正整数排列字符串

[编程题]无限长正整数排列字符串
  • 热度指数:10044 时间限制: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'}

备注:

#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)
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 <iostream>
using namespace std;
#include <string>

int main() {
    int n;
    cin >> n;
    string s;
    for(int i = 1; i <= 500; ++i){
        s += to_string(i);
    }
    cout << s[n-1] << endl;
}
// 64 位输出请用 printf("%lld")

发表于 2025-12-25 01:15:06 回复(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)
n = input()
a = ''
for i in range(1,int(n)+1):
    a = a + str(i)
    if len(a) > int(n):
        break
print(a[int(n)-1])

发表于 2026-01-23 21:37:04 回复(0)
#include <iostream>
#include<string>
using namespace std;

int main() {
    int n;
    cin>>n;
    int num=1,falg=0;
    while(falg==0)
    {
        string s=to_string(num);
        for(auto x:s)
        {
            n--;
            if(n==0)
            {
                falg=1;
                cout<<x<<endl;
                break;
            }
        }
        num++;
    }
    return 0;
    }

发表于 2026-01-23 13:07:55 回复(0)
#include <stdio.h>
 
int main() {
    int n,num = 1, temp = 0;
    scanf ("%d", &n);
    start:
     
    //几位数就对判断位数的变量加几
    if (!(num / 10)) temp ++;
    else if (!(num / 100)) temp += 2;
    else temp += 3;
     
    //对输出第几位的判断
    if (temp > n + 1) printf ("%d", num /100);
    else if (temp > n) printf ("%01d", num % 100 / 10);
    else if (temp == n) printf ("%d", num % 10);
    
    //temp < n说明位数还不够,再一次进入循环。用goto命令进行循环是写着玩的,纯整活,最好用while判断语句。
    else {
        num ++;
        goto start;
    }
    return 0;
 }

发表于 2026-01-21 22:17:32 回复(0)
#include <stdio.h>
#include<string.h>
int main(){
    int n;
    scanf("%d",&n);
    int weishu=1;
    int start=1;
    int count=9;
    while(n>count*weishu)
    {  
        n-=count*weishu;
        count*=10;
        weishu+=1;
        start*=10;
    }
    int m,k,a;
    m=start+(n/weishu);
    k=weishu+1-(n%weishu);
    if(n%weishu==0)
    {
        a=(start+(n/weishu-1))%10;
    }
    else
    {
        while(k!=0)
        {
           a=m%10;
           m/=10;
           k-=1;
        }
    }
    printf("%d",a);
}
发表于 2026-01-19 11:00:33 回复(0)
#include <iostream>
using namespace std;

int main() {
    int n;
    cin>>n;
    // len初始为一位,start也从1开始,count是这个位数共有多少个数字
    int len = 1;
    int start = 1;
    int count = 9;
    // 判断位数
    while (n>len*count) {
        // 把算过的层剔除掉
        n-=len*count;
        // 累加层数和初始以及位数的包含个数
        len++;
        start *= 10;
        count *= 10;
    }
    // 这里的(n-1)/len是判断是否进1,可以用for来理解。下同
    long long tmp = start+(n-1)/len;
    cout<<to_string(tmp)[(n-1)%len]<<endl;
}
发表于 2026-01-11 18:02:29 回复(0)
#include <stdio.h>

int main() {
    int n,a[1000] = { 1,2,3,4,5,6,7,8,9,1,0,1,1,1,2,1,3,1,4,1,5,1,6,1,7,1,8,1,9,2,0,2,1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,3,0,3,1,3,2,3,3,3,4,3,5,3,6,3,7,3,8,3,9,4,0,4,1,4,2,4,3,4,4,4,5,4,6,4,7,4,8,4,9,5,0,5,1,5,2,5,3,5,4,5,5,5,6,5,7,5,8,5,9,6,0,6,1,6,2,6,3,6,4,6,5,6,6,6,7,6,8,6,9,7,0,7,1,7,2,7,3,7,4,7,5,7,6,7,7,7,8,7,9,8,0,8,1,8,2,8,3,8,4,8,5,8,6,8,7,8,8,8,9,9,0,9,1,9,2,9,3,9,4,9,5,9,6,9,7,9,8,9,9,1,0,0,1,0,1,1,0,2,1,0,3,1,0,4,1,0,5,1,0,6,1,0,7,1,0,8,1,0,9,1,1,0,1,1,1,1,1,2,1,1,3,1,1,4,1,1,5,1,1,6,1,1,7,1,1,8,1,1,9,1,2,0,1,2,1,1,2,2,1,2,3,1,2,4,1,2,5,1,2,6,1,2,7,1,2,8,1,2,9,1,3,0,1,3,1,1,3,2,1,3,3,1,3,4,1,3,5,1,3,6,1,3,7,1,3,8,1,3,9,1,4,0,1,4,1,1,4,2,1,4,3,1,4,4,1,4,5,1,4,6,1,4,7,1,4,8,1,4,9,1,5,0,1,5,1,1,5,2,1,5,3,1,5,4,1,5,5,1,5,6,1,5,7,1,5,8,1,5,9,1,6,0,1,6,1,1,6,2,1,6,3,1,6,4,1,6,5,1,6,6,1,6,7,1,6,8,1,6,9,1,7,0,1,7,1,1,7,2,1,7,3,1,7,4,1,7,5,1,7,6,1,7,7,1,7,8,1,7,9,1,8,0,1,8,1,1,8,2,1,8,3,1,8,4,1,8,5,1,8,6,1,8,7,1,8,8,1,8,9,1,9,0,1,9,1,1,9,2,1,9,3,1,9,4,1,9,5,1,9,6,1,9,7,1,9,8,1,9,9,2,0,0,2,0,1,2,0,2,2,0,3,2,0,4,2,0,5,2,0,6,2,0,7,2,0,8,2,0,9,2,1,0,2,1,1,2,1,2,2,1,3,2,1,4,2,1,5,2,1,6,2,1,7,2,1,8,2,1,9,2,2,0,2,2,1,2,2,2,2,2,3,2,2,4,2,2,5,2,2,6,2,2,7,2,2,8,2,2,9,2,3,0,2,3,1,2,3,2,2,3,3,2,3,4,2,3,5,2,3,6,2,3,7,2,3,8,2,3,9,2,4,0,2,4,1,2,4,2,2,4,3,2,4,4,2,4,5,2,4,6,2,4,7,2,4,8,2,4,9,2,5,0,2,5,1,2,5,2,2,5,3,2,5,4,2,5,5,2,5,6,2,5,7,2,5,8,2,5,9,2,6,0,2,6,1,2,6,2,2,6,3,2,6,4,2,6,5,2,6,6,2,6,7,2,6,8,2,6,9,2,7,0,2,7,1,2,7,2,2,7,3,2,7,4,2,7,5,2,7,6,2,7,7,2,7,8,2,7,9,2,8,0,2,8,1,2,8,2,2,8,3,2,8,4,2,8,5,2,8,6,2,8,7,2,8,8,2,8,9,2,9,0,2,9,1,2,9,2,2,9,3,2,9,4,2,9,5,2,9,6,2,9,7,2,9,8,2,9,9,3,0,0,3,0,1,3,0,2,3,0,3,3,0,4,3,0,5,3,0,6,3,0,7,3,0,8,3,0,9,3,1,0,3,1,1,3,1,2,3,1,3,3,1,4,3,1,5,3,1,6,3,1,7,3,1,8,3,1,9,3,2,0,3,2,1,3,2,2,3,2,3,3,2,4,3,2,5,3,2,6,3,2,7,3,2,8,3,2,9,3,3,0,3,3,1,3,3,2,3,3,3,3,3,4,3,3,5,3,3,6,3,3,7,3,3,8,3,3,9,3,4,0,3,4,1,3,4,2,3,4,3,3,4,4,3,4,5,3,4,6,3,4,7,3,4,8,3,4,9,3,5,0,3,5,1,3,5,2,3,5,3,3,5,4,3,5,5,3,5,6,3,5,7,3,5,8,3,5,9,3,6,0,3,6,1,3,6,2,3,6,3,3,6,4,3,6,5,3,6,6,3,6,7,3,6,8,3,6,9,3 };
    scanf("%d", &n);
    printf("%d", a[n - 1]);
    return 0;
}

发表于 2026-01-11 00:31:33 回复(0)
Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int temp=0; // 9 //10-189 //181  if(n<=9){
    System.out.println(n);  return; } if(n>9&&n<=189){
    n=n-9;  int shang=n/2;  int yushu=n%2;  if(yushu==1){
      temp= 10+shang;  System.out.println( temp/10);  return;    }else {
        temp=10+shang-1;  System.out.println(temp%10);  return;  }
} if(n>189){
    n=n-189;  int shang=n/3;  int yushu=n%3;   if(yushu==0){
       temp= 100+shang-1;  System.out.println(temp%10);  return;  }else if(yushu==1){
        temp= 100+shang;  System.out.println(temp/100);  }else {
        temp= 100+shang;  System.out.println(temp/10%10);  }


}
发表于 2026-01-08 16:19:07 回复(0)
import java.util.Scanner;
import java.util.stream.LongStream;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        long[] s = LongStream.rangeClosed(1,1000).toArray();
        int n=in.nextInt();
        StringBuffer ss = new StringBuffer();
        for(long c:s){
            ss.append(String.valueOf(c));
        }
        System.out.print(ss.charAt(n-1));
       
    }
}
发表于 2025-12-21 17:56:26 回复(0)
这题纯闲的没事
发表于 2025-12-20 09:15:11 回复(1)
#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)