输出特殊序列第n个数是多少

输出特殊序列第n个数是多少

题意

  • 例如:
    • 11135917171513…
    • 12361181091010…
  • 规律为:前三位数字为初始输入值,从第4位数开始等于前三位数相加,相加大于10则分为两位进行存储
  • 求这组序列第n位的值
  • 4 <= n <= (2^32 - 1)

思路

由于n值可能会很大,所以用循环数组来存放中间产生的结果。因为计算都是基于前三个数计算的,所以这个数组只需要a[3]足够了。

#include<stdio.h>

int main()
{
    char a1[3] = {}; //用于存放初始的三位数
    char a[3] = {};  //该数组变量用于循环存放处理序列
    printf("请输入初始的三位数,每位以空格隔开:\n");
    scanf("%c %c %c", &a1[0], &a1[1], &a1[2]);
    int pos;    //序列位置索引
    int sum;    //存放三位数相加的和
    int n;      //存放想得到的第n个位置
    char shi, ge;   //将计算得到的数字转换成字符数字存放(因三位数相加不可能超过2位数,故两位足够)

    for(;;){
        printf("输入想得到的第几位数字:\n");
        scanf("%d", &n);
        pos = 2;    //由于初始数组里面已经有三位数,所以这里pos为2
        n = n - 1;  //减1,为了和数组位置索引统一起来
        sum = 0;
        /* 循环数组初始化 */
        a[0] = a1[0];   
        a[1] = a1[1];
        a[2] = a1[2];
        
        while(pos < n){ //循环结束条件pos == n 或者pos == n+1(当所要求得的位置前三位加起来大于10会出现此种情况)
            sum = a[0] + a[1] + a[2] - 3 * '0';
            
            /* sum大于等于10则分为两位存放 */
            if(sum >= 10){
                shi = sum/10 + '0';
                ge = sum%10 + '0';
                
                /* 循环存放在数组中,节约内存开销 */
                a[(++pos)%3] = shi;
                a[(++pos)%3] = ge;
            } else {    //sum不大于10时,只需要一位就可以存放
                a[(++pos)%3] = sum + '0';
            }
        }

    printf("%c\n", a[n%3]); //输出对应数组索引的数即为要求的数(注意这里的n不能换成pos)
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值