首页 > 试题广场 >

无限长正整数排列字符串

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