user-0 提问: 一道C语言练习题，不知道错在哪里！！！

回复:
user: user-1
content: 死了一堆脑细胞！自己测一下！   #include <stdio.h>  int main() { 	unsigned int m = 0, n = 0, i, k = 1, k1 = 1, x, y, v; 	unsigned int values[10] = {0}; 	 	printf("Please input n:"); 	scanf("%u", &n);	 	 	v = n / 10; 	 	//k 第m位单位 	//k1 第m-1位单位  	while(1) 	{ 		x = n % k; 		  // 余下所有值  		y = (n / k) % 10; // 第m位数  		 		for (i = 0; i < 10; i++) 		{ 			values[i] += y * m * k1; 		}   		for (i = 1; i < y; i++) 		{ 			values[i] += k;	 		} 		 		if (y > 0) 		{ 			values[y] += x + 1;			 		} 		 		values[0] -= k1 - 1;  		if (k > v) 		{ 			break; 		} 		 		k *= 10; 		 		if (m++ > 0) 		{ 			k1 *= 10; 		}	 	}      for(i = 0; i < 10; i++)      {      	printf("%u\n", values[i]);     }       return 0; }

user: user-1
content: 你要是用OJ的话，把程序里面开始的打印信息去掉！！  引用 13 楼 CLD1994 的回复:[quote=引用 12 楼 lunat 的回复:] 死了一堆脑细胞！自己测一下！   #include <stdio.h>  int main() { 	unsigned int m = 0, n = 0, i, k = 1, k1 = 1, x, y, v; 	unsigned int values[10] = {0}; 	 	printf("Please input n:"); 	scanf("%u", &n);	 	 	v = n / 10; 	 	//k 第m位单位 	//k1 第m-1位单位  	while(1) 	{ 		x = n % k; 		  // 余下所有值  		y = (n / k) % 10; // 第m位数  		 		for (i = 0; i < 10; i++) 		{ 			values[i] += y * m * k1; 		}   		for (i = 1; i < y; i++) 		{ 			values[i] += k;	 		} 		 		if (y > 0) 		{ 			values[y] += x + 1;			 		} 		 		values[0] -= k1 - 1;  		if (k > v) 		{ 			break; 		} 		 		k *= 10; 		 		if (m++ > 0) 		{ 			k1 *= 10; 		}	 	}      for(i = 0; i < 10; i++)      {      	printf("%u\n", values[i]);     }       return 0; }  程序是对的，但是提交上去还是显示运行错误65%。哎。。算了，改天去问问老师~[/quote]

user: user-0
content: 引用 12 楼 lunat 的回复:死了一堆脑细胞！自己测一下！   #include <stdio.h>  int main() { 	unsigned int m = 0, n = 0, i, k = 1, k1 = 1, x, y, v; 	unsigned int values[10] = {0}; 	 	printf("Please input n:"); 	scanf("%u", &n);	 	 	v = n / 10; 	 	//k 第m位单位 	//k1 第m-1位单位  	while(1) 	{ 		x = n % k; 		  // 余下所有值  		y = (n / k) % 10; // 第m位数  		 		for (i = 0; i < 10; i++) 		{ 			values[i] += y * m * k1; 		}   		for (i = 1; i < y; i++) 		{ 			values[i] += k;	 		} 		 		if (y > 0) 		{ 			values[y] += x + 1;			 		} 		 		values[0] -= k1 - 1;  		if (k > v) 		{ 			break; 		} 		 		k *= 10; 		 		if (m++ > 0) 		{ 			k1 *= 10; 		}	 	}      for(i = 0; i < 10; i++)      {      	printf("%u\n", values[i]);     }       return 0; }  程序是对的，但是提交上去还是显示运行错误65%。哎。。算了，改天去问问老师~

user: user-1
content: scanf("%u", &d)

user: user-0
content: 我加了unsigned int。加了int main() return 0; 但是还是错误····

user: user-2
content: 代码没有问题，我用楼主的代码在VC6.0中能够正确运行！ #include <stdio.h> int main()  {     int i,t,n;     int count[10] = {0};     scanf("%d",&n);     for(i = 1; i <= n; i++)      {         t = i;         while(t)         {             count[t%10]++;             t/=10;         }     }     for(i = 0; i < 10; i++)  		printf("数字%d用到的次数：%d\n",i, count[i]); 	return 1; }

user: user-0
content: 好像是算法比较烂···计算时间超时了。。。谁能教教我怎么写简单？

user: user-3
content: 还真看不出来。觉得没有问题耶！试着用楼上说的 int main（） 加个返回值试试！

user: user-4
content: 都应该用unsigned int，并且如果n输入超过范围要舍弃。  引用 楼主 CLD1994 的回复:一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排，  每个页码都不含多余的前导数字0。例如，第6 页用数字6 表示，而不是06 或006 等。数  字计数问题要求对给定书的总页码n，计算出书的全部页码中分别用到多少次数字0，1，  2，…，9。 输入 给出表示书的总页码的整数n（1≤n≤2^31-1）   输出 输出10行，在第k行输出页码中用到数字k-1 的次数，k=1，2，…，10。   我的代码如下。求解错在哪里。判定平台说运行错误。。。 #include <stdio.h> main()  {     int i,t,n;     int count[10] = {0};     scanf("%d",&n);     for(i = 1; i <= n; i++)      {         t = i;         while(t)         {             count[t%10]++;             t/=10;         }     }     for(i = 0; i < 10; i++)      printf("%d\n", count[i]); }

user: user-5
content: 暂时没看出错误来，能不能把错误贴出来。如果一定要说有错的话就是风格问题。你的main函数写的不合规定。要改成这种int main()  { 	return 0; }C/C++标准只允许int返回型的main，void虽然不算错但不是标准，但你的光秃秃的main肯定算错（VC6等老编译器不算）

user: user-5
content: 引用 5 楼 CLD1994 的回复:我加了unsigned int。加了int main() return 0; 但是还是错误····   还有个可能性，你输入的n太大了，计算时间比较长，耐心等待就好了。当然也可能会因为太大溢出了。 最好贴下错误。

user: user-6
content: 2^31-1 =2147483647 也可能是有溢出。 这是个10位数， 下面  是（0～9）总个数统计： 1 位数 10个   2位数  90*2个  3位数  900*3个 4位数  9000*4个   。。。。。 9 位数 有 900000000*9个 1000000000 ～2000000000-1 和  9 位数 个数相同  这就有18 * 900000000 个数字了   这样平均 每个数字的个数为 1.8*900000000 =16.2 *100000000  所以，非常有可能会溢出。    而楼主的时间复杂度是  ∑log i （i=1~n)   大概是 = O(N log N) ~ O(N （log N)^2)  而这个 问题的时间复杂度,大约只需要O(10*（logN）^2)==> O (log*N) < O(N) ; c=10  不妨，先计算一下, 统计 1000000000 ～2000000000 的每个数字的个数，时间复杂度是多少。 1000000000 ～2000000000 大约就是 N log(N) 了

user: user-6
content: 估计时间复杂度，比较高超时了。

user: user-7
content: LZ 我这里运行也没有错误哦