好久没刷题了(阿里测试题)

这里写图片描述
我大哥给我做的,今天终于有时间做了,因为没有测试数据所以就不知道是否正确,所以希望各位路过大神指教
思路
这里写图片描述
类似杨辉三角形,因此竖着列出来,然后打表把各种值求出最后找就可以了。

打表代码
#include<stdio.h>
/*
输出的i为每块最后一行的标号的个数(没错) 
sum为这个块字幕的个数。 

*/ 
int main()
{
    int i, sum = 0,n=1;
    for(i = 1;  n<=9; i++){
        sum += i;
        n++;
    }//i=10 
    printf("i = %d   sum = %d\n", i-1 ,sum); 

    for(i = i+1; n <= 99; ){
        sum += i; 
        i+=2;
        n++;
    } // 

    printf("i = %d   sum = %d\n", i-2 ,sum); 

    for(i = i+1; n <= 999; ){
        sum += i; 
        i+=3;
        n++;
    } 
    printf("i = %d   sum = %d\n", i-3 ,sum); 

    for(i = i+1; n <= 9999; ){
        sum += i; 
        i+=4;
        n++;
    } 
    printf("i = %d   sum = %d\n", i-4 ,sum); 

    return 0;
}
#include<stdio.h>
int dukuai(int k);//判断这个标号位于哪个大块中 
int dubiaohao(int kuai, int k);
int main()
{
    int k,m,kuai;
    while(scanf("%d",&k)!=NULL){
        kuai = dukuai(k);
        printf("%d\n",kuai);
        m = dubiaohao(kuai,k); 
        printf("%d\n",m);
    }

    return 0;
}
/*
i表示这行的总标号数
sum表示从第一行开始到该行最后一个标号的总标号数 
sum-i-2表示第一行开始到上一行最后一个标号的总标号数 
*/

int dubiaohao(int kuai, int k)
{
    int sum,i,biaohao;
    if(kuai == 1){
        sum = 0;
        for(i = 1; ; i++){//从第一行遍历起,当小于该行最后一个数的标号时则表示位于该行。 
            sum += i;
            if(k<=sum){
                biaohao = k-(sum-i);
                break;
            }
        }
    }else if(kuai == 2){
        sum = 45;
        //第9行有9个标号 
        for(i = 11; ; i+=2){//从第10行遍历起,当小于该行最后一个数的标号时则表示位于该行。 
            sum += i;
            if(k<=sum){
                biaohao = k-(sum-i);
                break;
            }
        }
    }else if(kuai == 3){
        sum = 9045;
        //第99行有190个标号 
        for(i = 192; ; i+=3){//从第100行遍历起,当小于该行最后一个数的标号时则表示位于该行。 
            sum += i;
            if(k<=sum){
                biaohao = k-(sum-i);
                break;
            }
        }
    }else if(kuai == 4){
        sum = 1395495;
        //第999行有2892个标号 
        for(i = 2893; ; i+=4){//从第1000行遍历起,当小于该行最后一个数的标号时则表示位于该行。 
            sum += i;
            if(k<=sum){
                biaohao = k-(sum-i);
                break;
            }
        }
    }
    return biaohao; 
}
int dukuai(int k)
{
    if(k<=45){//1到9 
        k = 1;
    }else if(k<=9045){//10到99 
        k = 2;
    }else if(k<=1395495){//100到999 
        k = 3;
    }else {//1000到9999 
        k = 4;
    }
    return k;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值