我大哥给我做的,今天终于有时间做了,因为没有测试数据所以就不知道是否正确,所以希望各位路过大神指教
思路
类似杨辉三角形,因此竖着列出来,然后打表把各种值求出最后找就可以了。
打表代码
#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;
}