user-0 提问: 大佬帮忙看看

回复:
user: user-0
content: 引用 16 楼 寻开心 的回复:sprintf那里也是lld  这种状态是比较讨厌， 没有测试数据，只能猜 好了，大佬，改完结果是一样的，我决定give up了，也许这题它注定与我无缘 非常感谢您的帮助

user: user-1
content: sprintf那里也是lld  这种状态是比较讨厌， 没有测试数据，只能猜

user: user-0
content: 引用 14 楼 寻开心 的回复:long long int Len[13]  long long int nStart[14] 这两个怎么不一样多啊  for(j = 1;j < 14;j++) 会访问到Len[13]吗？ 如果会就越界了  long long int  scanf("%d",&n); 这里是不是要改成  %lld啊 #include<stdio.h> int main() { 	char buffer[100]; 	long long int n = 0; 	long long int v = 0; 	long long int Len[14] = {0,9,180,2700,36000,450000,5400000,63000000,720000000,8100000000,90000000000,990000000000,10800000000000,1170000000000000}; 	long long int nStart[14] = {0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000}; 	int j = 0,k = 0; 	int T = 0; 	scanf("%d",&T); 	char c[100]; 	for(k = 0;k < T;k++) 	{ 		scanf("%lld",&n); 		for(j = 1;j < 14;j++) 		{ 			if(n > Len[j]) 				n-=Len[j]; 			else 				break; 		} 		n--; 		v = nStart[j]+n/j; 		sprintf(buffer,"%d",v); 		c[k] = buffer[n%j]; 	} 	for(k = 0;k < T;k++) 		printf("%c\n",c[k]); 	return 0; } 改成这样应该没问题了吧，可结果还是只通过一组，大佬，我是不是该放弃了

user: user-1
content: long long int Len[13]  long long int nStart[14] 这两个怎么不一样多啊  for(j = 1;j < 14;j++) 会访问到Len[13]吗？ 如果会就越界了  long long int  scanf("%d",&n); 这里是不是要改成  %lld啊

user: user-0
content: 引用 11 楼 寻开心 的回复:测试程序， 用int，只能跑到 循环输出前300个 #include <stdio.h> #include <string.h>  #include<stdio.h> int main() {     int  nLen = 9;     int  v = 0;     int Len[13]    = { 0,9,180,2700,36000,450000,5400000,63000000,720000000};     int nStart[13] = { 0,1, 10, 100, 1000, 10000, 100000, 1000000, 10000000};     int j;     int n;      printf("Start....\n");     char buffer[100];     char output[301] = {0};     int index =0;     int k;     for ( k=1; k<300; k++ ) {         n = k;         for(j = 1; j<nLen;j++)         {             if(n > Len[j])                 n-=Len[j];             else                 break;         }         n--;         v = nStart[j]+ n/j;         sprintf(buffer,"%d",v);         output[index++] = buffer[n%j];     };     printf("%s", output);     return 0; };

user: user-0
content: 引用 11 楼 寻开心 的回复:测试程序， 用int，只能跑到 循环输出前300个 #include <stdio.h> #include <string.h>  #include<stdio.h> int main() {     int  nLen = 9;     int  v = 0;     int Len[13]    = { 0,9,180,2700,36000,450000,5400000,63000000,720000000};     int nStart[13] = { 0,1, 10, 100, 1000, 10000, 100000, 1000000, 10000000};     int j;     int n;      printf("Start....\n");     char buffer[100];     char output[301] = {0};     int index =0;     int k;     for ( k=1; k<300; k++ ) {         n = k;         for(j = 1; j<nLen;j++)         {             if(n > Len[j])                 n-=Len[j];             else                 break;         }         n--;         v = nStart[j]+ n/j;         sprintf(buffer,"%d",v);         output[index++] = buffer[n%j];     };     printf("%s", output);     return 0; }; #include<stdio.h> int main() { 	char buffer[100]; 	long long int n = 0; 	long long int v = 0; 	long long int Len[13] = {0,9,180,2700,36000,450000,5400000,63000000,720000000,8100000000,90000000000,990000000000,10800000000000}; 	long long int nStart[14] = {0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000}; 	int j = 0,k = 0; 	int T = 0; 	scanf("%d",&T); 	char c[100] = {0}; 	for(k = 0;k < T;k++) 	{ 		scanf("%d",&n); 		for(j = 1;j < 14;j++) 		{ 			if(n > Len[j]) 				n-=Len[j]; 			else 				break; 		} 		n--; 		v = nStart[j]+n/j; 		sprintf(buffer,"%d",v); 		c[k] = buffer[n%j]; 	} 	for(k = 0;k < T;k++) 		printf("%c\n",c[k]); 	return 0; } 这是最后的程序，我在编译器试了那两组数，结果正确 但到了它那里 却是这样，宝宝心里苦  请问这个程序还有什么错误吗

user: user-1
content: 测试程序， 用int，只能跑到 循环输出前300个 #include <stdio.h> #include <string.h>  #include<stdio.h> int main() {     int  nLen = 9;     int  v = 0;     int Len[13]    = { 0,9,180,2700,36000,450000,5400000,63000000,720000000};     int nStart[13] = { 0,1, 10, 100, 1000, 10000, 100000, 1000000, 10000000};     int j;     int n;      printf("Start....\n");     char buffer[100];     char output[301] = {0};     int index =0;     int k;     for ( k=1; k<300; k++ ) {         n = k;         for(j = 1; j<nLen;j++)         {             if(n > Len[j])                 n-=Len[j];             else                 break;         }         n--;         v = nStart[j]+ n/j;         sprintf(buffer,"%d",v);         output[index++] = buffer[n%j];     };     printf("%s", output);     return 0; };

user: user-1
content: nStart[14] = {0,1,10,100,1000,10000,100000,

user: user-1
content: 你说的对， 确实考虑不周 n -= nLen[j] 之后，都是从1开始不是从0开始 所以要这样  n--； v = nStart[j]+n/j;  不能这里减去1

user: user-0
content: 引用 7 楼 寻开心 的回复:nStart[13] = {0,0， 10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000};  这里是0个零， 1位数是从0开始，2位数是从10开始 #include<stdio.h> int main() { 	char buffer[100]; 	long long int n = 0; 	long long int v = 0; 	long long int Len[13] = {0,9,180,2700,36000,450000,5400000,63000000,720000000,8100000000,90000000000,990000000000,10800000000000}; 	long long int nStart[14] = {0,0,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000}; 	int j = 0; 	scanf("%d",&n); 	for(j = 1;j < 14;j++) 	{ 		if(n > Len[j]) 			n-=Len[j]; 		else 			break; 	} 	v = nStart[j]+n/j-1; 	printf("%d\n",v); 	sprintf(buffer,"%d",v); 	printf("%d",buffer[n%j]); } 结果总是得49，还有v=nStart[j]+n/j这里是不是要减1呀，因为个位是从0开始

user: user-1
content: nStart[13] = {0,0， 10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000};  这里是0个零， 1位数是从0开始，2位数是从10开始

user: user-0
content: 引用 5 楼 寻开心 的回复:long long int可以表示20次方  char buffer[100]；  第一个这样一个变量 #include<stdio.h> int main() { 	char buffer[100]; 	long long int n = 0; 	long long int v = 0; 	long long int Len[13] = {0,9,180,2700,36000,450000,5400000,63000000,720000000,8100000000,90000000000,990000000000,10800000000000}; 	long long int nStart[13] = {0,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000}; 	int j = 0; 	scanf("%d",&n); 	for(j = 1;j < 13;j++) 	{ 		if(n > Len[j]) 			n-=Len[j]; 		else 			break; 	} 	v = nStart[j]+n/j; 	sprintf(buffer,"%d",v); 	printf("%d",buffer[n%j]); } 这次能运行了，但是值不对

user: user-1
content: long long int可以表示20次方  char buffer[100]；  第一个这样一个变量

user: user-0
content: 引用 1 楼 寻开心 的回复:不能用pow函数，它太慢了 做一个数组 int LenSize; // 数组元素的个数 int Len= {0， 9, 90*2, 900*3, 9000*4, 90000*5, 900000*6, 9000000*7 , ......}; int nStart= {0, 10, 100, 1000, 10000, 10000, 1000000, ....} 根据题目要求的输入数据的范围来做好这个数组的初始化 对于输入的n for (j=1; j<LenSize; j++）     if ( n  > Len[j] ) n -= Len[j]; else break; 此时j表示的输入的数字对应的那个数字的位数 如果j=3，表示输入的数位于3位数区，距离第一个三位数100的首字母1的距离是n（循环当中 -= 操作后的n，不是输入的n） v = nStart[j] + n/j;   这个数具体是几 v的从高位向低位的第 n%j 位就是答案 sprintf(buffer,  "%d",  v); 输出buffer[n%j]就可以了 大佬，n的范围到10的12次方，我只好用double了，但是之后sprintf,和之后的printf就出问题了，还说suffer未定义，该咋办啊，没学过sprintf和buffer,不知道用的对不对 #include<stdio.h> int main() { 	 	double n = 0; 	double v = 0; 	double Len[13] = {0,9,180,2700,36000,450000,5400000,63000000,720000000,8100000000,90000000000,990000000000,10800000000000}; 	double nStart[13] = {0,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000}; 	int j; 	for(j = 1;j < 13;j++) 	{ 		if(n > Len[j]) 			n-=Len[j]; 		else 			break; 	} 	v = nStart[j]+n/j; 	sprintf(buffer,"%f",v); 	printf("%f",buffer[n%j]);

user: user-0
content: 好的，谢谢

user: user-1
content: 这些在循环当中经常用到的数值， 要么提前定义到数组里面，要么做一个初始化循环操作，全部赋值过去 不能在循环里面每次单独的去算， 太耗时间了

user: user-1
content: 不能用pow函数，它太慢了 做一个数组 int LenSize; // 数组元素的个数 int Len= {0， 9, 90*2, 900*3, 9000*4, 90000*5, 900000*6, 9000000*7 , ......}; int nStart= {0, 10, 100, 1000, 10000, 10000, 1000000, ....} 根据题目要求的输入数据的范围来做好这个数组的初始化 对于输入的n for (j=1; j<LenSize; j++）     if ( n  > Len[j] ) n -= Len[j]; else break; 此时j表示的输入的数字对应的那个数字的位数 如果j=3，表示输入的数位于3位数区，距离第一个三位数100的首字母1的距离是n（循环当中 -= 操作后的n，不是输入的n） v = nStart[j] + n/j;   这个数具体是几 v的从高位向低位的第 n%j 位就是答案 sprintf(buffer,  "%d",  v); 输出buffer[n%j]就可以了