user-0 提问: 如何更高效率的显示第1500个数呢？省略前面1-1499个数。

回复:
user: user-1
content: 引用 2 楼 bagademosuki 的回复:void main()    {   int cnt;   for (int i=1,j=1;j<=1500;i++)     {        if (POW(i))        {          j++;        }     }  printf("第1500个=%d\n",i);    } 你既然只要第1500个，前面就不要输出就好了 帅爆了 比我的快！

user: user-1
content: 算法效率低下 #include "stdafx.h" #include <stdio.h> #include<stdlib.h> #include<iostream> #include<vector> using namespace std;  int min3(int a,int b,int c) { 	int tmp=(a<b?a:b); 	return (tmp<c?tmp:c); } int main() { 	vector<int> uglyNum; 	uglyNum.push_back(1);  //初始只有1在数组中 	int t2=0,t3=0,t5=0; //每个因子开始相乘的下标位置 	int i,j,k; 	while(uglyNum.size()!=1500) 	{ 		int m2,m3,m5;  //保存每个因子得到的值 		for(i=t2;i<uglyNum.size();i++) 			if(2*uglyNum[i]>uglyNum.back()) 			{ 				m2=2*uglyNum[i]; 				break; 			} 			for(j=t3;j<uglyNum.size();j++) 				if(3*uglyNum[j]>uglyNum.back()) 				{ 					m3=3*uglyNum[j]; 					break; 				} 				for(k=t5;k<uglyNum.size();k++) 					if(5*uglyNum[k]>uglyNum.back()) 					{ 						m5=5*uglyNum[k]; 						break; 					} 					int tmp = min3(m2,m3,m5); 					uglyNum.push_back(tmp); 					if(tmp==m2) 						t2=i+1;  //下标位置进行更新 					if(tmp==m3) 						t3=j+1; 					if(tmp==m5) 						t5=k+1; 	} 	for(int i=0;i<uglyNum.size();i++) 		 printf("第%d个=%d\n",i+1,uglyNum[i]); 		cout<<endl; 	system("pause"); 	return 0; }

user: user-2
content: 引用 3 楼 brookmill 的回复:当然不是printf的问题，printf再慢，也只不过执行1500次而已，浪费不了多少时间。 关键还是算法的效率太低了。我运行楼主的代码要20多秒，而高效的解法(包括1500个printf)也就几毫秒。 这是个经典题目，叫“丑数”，也常见于面试，随便一搜就能找到大量的解法和代码。 基本的思路和求质数的筛法类似，不要浪费大量时间判断每个数是不是符合要求，而是反过来直接生成符合要求的数。 #include <stdio.h> int results[2048]; int main() {   int idx2 = 1;   int idx3 = 1;   int idx5 = 1;   results[1] = 1;   for (int i=2; i<=1500; i++)   {     int result2 = 2 * results[idx2];     int result3 = 3 * results[idx3];     int result5 = 5 * results[idx5];     results[i] = (result2 < result3) ? result2 : result3;     if (results[i] > result5) {       results[i] = result5;     }     printf("第%d个=%d\n", i, results[i]);     while (2 * results[idx2] <= results[i]) idx2++;     while (3 * results[idx3] <= results[i]) idx3++;     while (5 * results[idx5] <= results[i]) idx5++;   }  return 0; }+1，逆向思维好

user: user-3
content: 当然不是printf的问题，printf再慢，也只不过执行1500次而已，浪费不了多少时间。 关键还是算法的效率太低了。我运行楼主的代码要20多秒，而高效的解法(包括1500个printf)也就几毫秒。 这是个经典题目，叫“丑数”，也常见于面试，随便一搜就能找到大量的解法和代码。 基本的思路和求质数的筛法类似，不要浪费大量时间判断每个数是不是符合要求，而是反过来直接生成符合要求的数。 #include <stdio.h> int results[2048]; int main() {   int idx2 = 1;   int idx3 = 1;   int idx5 = 1;   results[1] = 1;   for (int i=2; i<=1500; i++)   {     int result2 = 2 * results[idx2];     int result3 = 3 * results[idx3];     int result5 = 5 * results[idx5];     results[i] = (result2 < result3) ? result2 : result3;     if (results[i] > result5) {       results[i] = result5;     }     printf("第%d个=%d\n", i, results[i]);     while (2 * results[idx2] <= results[i]) idx2++;     while (3 * results[idx3] <= results[i]) idx3++;     while (5 * results[idx5] <= results[i]) idx5++;   }  return 0; }

user: user-4
content: void main()    {   int cnt;   for (int i=1,j=1;j<=1500;i++)     {        if (POW(i))        {          j++;        }     }  printf("第1500个=%d\n",i);    } 你既然只要第1500个，前面就不要输出就好了

user: user-5
content: 是的printf是个很低效的语句，涉及到外设的语句效率都不会高到那里去