user-0 提问: 这程序哪有错？感觉。。。没错啊！

回复:
user: user-0
content: 引用 23 楼 hnhnanhai 的回复:我的想法是这样 #include <stdio.h>  //一人的年龄的三次方有四位数，四次方有六位数，且这十位数刚好包括从0-9。二次方有三位数。求年龄  void main() {     int  x,y,age;     int  a[10]; 	bool m = false;  	for (age = 10; age < 22; age++) 	{ 		x = age * age * age; 		for (int i = 0 ; i < 4 ; i++) 		{ 		   a[i] = x % 10; 		   x /= 10; 		} 		y = age * age * age * age; 		for (; i < 10; i++) 		{ 			a[i] = y % 10; 			y /= 10; 		}  		for (i = 0; i < 9; i++) 		{ 			for (int j = i+1; j < 10; j++) 			{ 				if (a[i] != a[j]) 				{ 					m = true; 				} 				else 				{ 					m = false; 					break; 				} 			} 			if (!m) 			{ 				break; 			} 		} 		if (m) 		{ 			printf("%d\n",age); 		} 	}  } 抓住两两不相等，但是你干嘛不ture，要false啊。。。非常人。。

user: user-1
content: 我的想法是这样 #include <stdio.h>  //一人的年龄的三次方有四位数，四次方有六位数，且这十位数刚好包括从0-9。二次方有三位数。求年龄  void main() {     int  x,y,age;     int  a[10]; 	bool m = false;  	for (age = 10; age < 22; age++) 	{ 		x = age * age * age; 		for (int i = 0 ; i < 4 ; i++) 		{ 		   a[i] = x % 10; 		   x /= 10; 		} 		y = age * age * age * age; 		for (; i < 10; i++) 		{ 			a[i] = y % 10; 			y /= 10; 		}  		for (i = 0; i < 9; i++) 		{ 			for (int j = i+1; j < 10; j++) 			{ 				if (a[i] != a[j]) 				{ 					m = true; 				} 				else 				{ 					m = false; 					break; 				} 			} 			if (!m) 			{ 				break; 			} 		} 		if (m) 		{ 			printf("%d\n",age); 		} 	}  }

user: user-2
content: 引用 14 楼 my_live_123 的回复:bug1,你的平方条件还没有用噻，问题条件都没有用完  bug2:这个逻辑错误，试想一部分相等，并不成立，你却输出结果了   for(i = 0 ; i <= 9 ; i++)                 {                      if (a[i] == s[i])                    printf("这位同学的年龄是%d\n",age);                    break;                  }            建议：你可以设置a[0]-a[9]值为1，然后算的各位数字为索引i，设置a[i]=0，计算过程中遇到a[j]=0，说明此j数字已经出现，就不必往下继续计算，结束此次循环。否则，计算完毕必定是结果，因为此次循环共产生10个数字，此次循环能执行到底，说明每个数字出现且仅出现一次。跳出循环输出结果结论。此外，未能执行到底的循环，记得把a[0]-a[9]还原到初始1的状态。  这样就不必排序，也能缩短计算时间（因为不满足的，中间就会停止本次循环）而且答案是惟一的，找到即可  其实我有一一种更加投机的想法：把这十个数相加，如果等于 1+2+。。。+9 ，则输出。这样子，岂不是更快？ 代码如下：结果还是18~~  #include<stdio.h> #include<math.h>  int main(void) {     int age = 18;     int age3,age4,result=0,temp = 0;     int  a[10],i,t,j;     int  s[10]={0,1,2,3,4,5,6,7,8,9}; 	do{ 		age3 = pow(age,3); 		for(i = 0 ; i <= 3 ; i++) 		{ 			a[i] = age3 % 10; 			age3 /= 10; 		} 		age4 = pow(age,4); 		 		for(i = 4 ; i <= 9 ; i++) 		{ 			a[i] = age4 % 10; 			age4 /= 10; 		} 		for(int i=0; i <10 ; i++) 		{ 			temp += i ; 			result +=a[i]; 		} 		if(temp == result) 		{ 			printf("这位同学的年龄是%d\n",age);		 		     break ; 		}  		age++; 	}     while(age <= 21);        return 0 ; }

user: user-2
content: 引用 14 楼 my_live_123 的回复:bug1,你的平方条件还没有用噻，问题条件都没有用完  bug2:这个逻辑错误，试想一部分相等，并不成立，你却输出结果了   for(i = 0 ; i <= 9 ; i++)                 {                      if (a[i] == s[i])                    printf("这位同学的年龄是%d\n",age);                    break;                  }            建议：你可以设置a[0]-a[9]值为1，然后算的各位数字为索引i，设置a[i]=0，计算过程中遇到a[j]=0，说明此j数字已经出现，就不必往下继续计算，结束此次循环。否则，计算完毕必定是结果，因为此次循环共产生10个数字，此次循环能执行到底，说明每个数字出现且仅出现一次。跳出循环输出结果结论。此外，未能执行到底的循环，记得把a[0]-a[9]还原到初始1的状态。  这样就不必排序，也能缩短计算时间（因为不满足的，中间就会停止本次循环）而且答案是惟一的，找到即可  在理。估计他只是想使用冒泡算法吧

user: user-2
content: for(i = 0 ; i <= 9 ; i++) 				{   					if (a[i] != s[i]) 					  break; 					else if (i==9) 					   printf("这位同学的年龄是%d\n",age);                 }              你是if语句没有判断对，你进行了排序，应该是 0-9这10个数字都匹配才能确定结果。  这位同学的年龄是18 Press any key to continue

user: user-3
content: bug1,你的平方条件还没有用噻，问题条件都没有用完  bug2:这个逻辑错误，试想一部分相等，并不成立，你却输出结果了   for(i = 0 ; i <= 9 ; i++)                 {                      if (a[i] == s[i])                    printf("这位同学的年龄是%d\n",age);                    break;                  }            建议：你可以设置a[0]-a[9]值为1，然后算的各位数字为索引i，设置a[i]=0，计算过程中遇到a[j]=0，说明此j数字已经出现，就不必往下继续计算，结束此次循环。否则，计算完毕必定是结果，因为此次循环共产生10个数字，此次循环能执行到底，说明每个数字出现且仅出现一次。跳出循环输出结果结论。此外，未能执行到底的循环，记得把a[0]-a[9]还原到初始1的状态。  这样就不必排序，也能缩短计算时间（因为不满足的，中间就会停止本次循环）而且答案是惟一的，找到即可

user: user-0
content: 引用 12 楼 zhouchichi203 的回复:[quote=引用 10 楼 abc594986308 的回复:] [quote=引用 5 楼 zhouchichi203 的回复:] 试试：将   for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i])                   printf("这位同学的年龄是%d\n",age);                   break;                 }              改为： for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i]) 					  ; 				  else                   break;                 }  		 			   if(i==10) 				   printf("这位同学的年龄是%d\n",age); 空语句的引用以及下面if（i == 10）的判断，没明白。注释下，谢谢啦[/quote]//for循环判断a数组中是否含有0-9  for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i])//若相等则什么也不做 					  ; 				  else             //不等则跳出for循环                   break;                 }  //若i==10，则表明上面的for循环运行到最后都没有跳出，说明a数组中含有数字0-9，表明这个age是我们要找的，打印出来 			   if(i==10) 				   printf("这位同学的年龄是%d\n",age);[/quote] 数组默认指向下一位么？定义时是a[10],i==10,就是这个数组指向了下一位了

user: user-4
content: 引用 10 楼 abc594986308 的回复:[quote=引用 5 楼 zhouchichi203 的回复:] 试试：将   for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i])                   printf("这位同学的年龄是%d\n",age);                   break;                 }              改为： for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i]) 					  ; 				  else                   break;                 }  		 			   if(i==10) 				   printf("这位同学的年龄是%d\n",age); 空语句的引用以及下面if（i == 10）的判断，没明白。注释下，谢谢啦[/quote]//for循环判断a数组中是否含有0-9  for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i])//若相等则什么也不做 					  ; 				  else             //不等则跳出for循环                   break;                 }  //若i==10，则表明上面的for循环运行到最后都没有跳出，说明a数组中含有数字0-9，表明这个age是我们要找的，打印出来 			   if(i==10) 				   printf("这位同学的年龄是%d\n",age);

user: user-3
content: 引用 21 楼 lc10915819 的回复:[quote=引用 20 楼 my_live_123 的回复:] [quote=引用 17 楼 lc10915819 的回复:]   [quote=引用 14 楼 my_live_123 的回复:] bug1,你的平方条件还没有用噻，问题条件都没有用完  bug2:这个逻辑错误，试想一部分相等，并不成立，你却输出结果了   for(i = 0 ; i <= 9 ; i++)                 {                      if (a[i] == s[i])                    printf("这位同学的年龄是%d\n",age);                    break;                  }            建议：你可以设置a[0]-a[9]值为1，然后算的各位数字为索引i，设置a[i]=0，计算过程中遇到a[j]=0，说明此j数字已经出现，就不必往下继续计算，结束此次循环。否则，计算完毕必定是结果，因为此次循环共产生10个数字，此次循环能执行到底，说明每个数字出现且仅出现一次。跳出循环输出结果结论。此外，未能执行到底的循环，记得把a[0]-a[9]还原到初始1的状态。  这样就不必排序，也能缩短计算时间（因为不满足的，中间就会停止本次循环）而且答案是惟一的，找到即可  其实我有一一种更加投机的想法：把这十个数相加，如果等于 1+2+。。。+9 ，则输出。这样子，岂不是更快？ 代码如下：结果还是18~~  #include<stdio.h> #include<math.h>  int main(void) {     int age = 18;     int age3,age4,result=0,temp = 0;     int  a[10],i,t,j;     int  s[10]={0,1,2,3,4,5,6,7,8,9}; 	do{ 		age3 = pow(age,3); 		for(i = 0 ; i <= 3 ; i++) 		{ 			a[i] = age3 % 10; 			age3 /= 10; 		} 		age4 = pow(age,4); 		 		for(i = 4 ; i <= 9 ; i++) 		{ 			a[i] = age4 % 10; 			age4 /= 10; 		} 		for(int i=0; i <10 ; i++) 		{ 			temp += i ; 			result +=a[i]; 		} 		if(temp == result) 		{ 			printf("这位同学的年龄是%d\n",age);		 		     break ; 		}  		age++; 	}     while(age <= 21);        return 0 ; } [/quote]  针对本题，你这种方案不可行 18:5832 104976 =45 19：6859 130321 = 38 20：8000 160000 = 32 21：9261 194481 = 45  如果问题拓展一下，也存在潜在的bug 1+...+9=45可以有很多种分解方案，不是嘛?比如1+2+(1+2)+4+...+9=2+2+2+4+...+9=45只要保证是10个数字就行 [/quote]】  其实还在于对待该问题的思路上，我只是突发奇想，想到的。其实，这题多变~谢谢你的批评哦[/quote]  恩，很好噻。有想法要多多交流。批评谈不上，属于讨论的结果！

user: user-2
content: 引用 20 楼 my_live_123 的回复:[quote=引用 17 楼 lc10915819 的回复:]   [quote=引用 14 楼 my_live_123 的回复:] bug1,你的平方条件还没有用噻，问题条件都没有用完  bug2:这个逻辑错误，试想一部分相等，并不成立，你却输出结果了   for(i = 0 ; i <= 9 ; i++)                 {                      if (a[i] == s[i])                    printf("这位同学的年龄是%d\n",age);                    break;                  }            建议：你可以设置a[0]-a[9]值为1，然后算的各位数字为索引i，设置a[i]=0，计算过程中遇到a[j]=0，说明此j数字已经出现，就不必往下继续计算，结束此次循环。否则，计算完毕必定是结果，因为此次循环共产生10个数字，此次循环能执行到底，说明每个数字出现且仅出现一次。跳出循环输出结果结论。此外，未能执行到底的循环，记得把a[0]-a[9]还原到初始1的状态。  这样就不必排序，也能缩短计算时间（因为不满足的，中间就会停止本次循环）而且答案是惟一的，找到即可  其实我有一一种更加投机的想法：把这十个数相加，如果等于 1+2+。。。+9 ，则输出。这样子，岂不是更快？ 代码如下：结果还是18~~  #include<stdio.h> #include<math.h>  int main(void) {     int age = 18;     int age3,age4,result=0,temp = 0;     int  a[10],i,t,j;     int  s[10]={0,1,2,3,4,5,6,7,8,9}; 	do{ 		age3 = pow(age,3); 		for(i = 0 ; i <= 3 ; i++) 		{ 			a[i] = age3 % 10; 			age3 /= 10; 		} 		age4 = pow(age,4); 		 		for(i = 4 ; i <= 9 ; i++) 		{ 			a[i] = age4 % 10; 			age4 /= 10; 		} 		for(int i=0; i <10 ; i++) 		{ 			temp += i ; 			result +=a[i]; 		} 		if(temp == result) 		{ 			printf("这位同学的年龄是%d\n",age);		 		     break ; 		}  		age++; 	}     while(age <= 21);        return 0 ; } [/quote]  针对本题，你这种方案不可行 18:5832 104976 =45 19：6859 130321 = 38 20：8000 160000 = 32 21：9261 194481 = 45  如果问题拓展一下，也存在潜在的bug 1+...+9=45可以有很多种分解方案，不是嘛?比如1+2+(1+2)+4+...+9=2+2+2+4+...+9=45只要保证是10个数字就行 [/quote]】  其实还在于对待该问题的思路上，我只是突发奇想，想到的。其实，这题多变~谢谢你的批评哦

user: user-3
content: 引用 17 楼 lc10915819 的回复:  [quote=引用 14 楼 my_live_123 的回复:] bug1,你的平方条件还没有用噻，问题条件都没有用完  bug2:这个逻辑错误，试想一部分相等，并不成立，你却输出结果了   for(i = 0 ; i <= 9 ; i++)                 {                      if (a[i] == s[i])                    printf("这位同学的年龄是%d\n",age);                    break;                  }            建议：你可以设置a[0]-a[9]值为1，然后算的各位数字为索引i，设置a[i]=0，计算过程中遇到a[j]=0，说明此j数字已经出现，就不必往下继续计算，结束此次循环。否则，计算完毕必定是结果，因为此次循环共产生10个数字，此次循环能执行到底，说明每个数字出现且仅出现一次。跳出循环输出结果结论。此外，未能执行到底的循环，记得把a[0]-a[9]还原到初始1的状态。  这样就不必排序，也能缩短计算时间（因为不满足的，中间就会停止本次循环）而且答案是惟一的，找到即可  其实我有一一种更加投机的想法：把这十个数相加，如果等于 1+2+。。。+9 ，则输出。这样子，岂不是更快？ 代码如下：结果还是18~~  #include<stdio.h> #include<math.h>  int main(void) {     int age = 18;     int age3,age4,result=0,temp = 0;     int  a[10],i,t,j;     int  s[10]={0,1,2,3,4,5,6,7,8,9}; 	do{ 		age3 = pow(age,3); 		for(i = 0 ; i <= 3 ; i++) 		{ 			a[i] = age3 % 10; 			age3 /= 10; 		} 		age4 = pow(age,4); 		 		for(i = 4 ; i <= 9 ; i++) 		{ 			a[i] = age4 % 10; 			age4 /= 10; 		} 		for(int i=0; i <10 ; i++) 		{ 			temp += i ; 			result +=a[i]; 		} 		if(temp == result) 		{ 			printf("这位同学的年龄是%d\n",age);		 		     break ; 		}  		age++; 	}     while(age <= 21);        return 0 ; } [/quote]  针对本题，你这种方案不可行 18:5832 104976 =45 19：6859 130321 = 38 20：8000 160000 = 32 21：9261 194481 = 45  如果问题拓展一下，也存在潜在的bug 1+...+9=45可以有很多种分解方案，不是嘛?比如1+2+(1+2)+4+...+9=2+2+2+4+...+9=45只要保证是10个数字就行

user: user-5
content: #include<stdio.h> int main(void) {     int  age = 10;     int  age2;     int  age3;     int  age4;     int  a[10]; 	int  i=0, n2=0,n3=0,n4=0;   	do{  		for (i=0;i<10;i++) 		{ 			a[i] = -1; 		} 		printf("%6d  ",age); 		age2 = age * age; 		age3 = age * age *age; 		age4 = age * age *age *age; 		n2 = age2/100; 		n3 = age3/1000; 		n4 = age4/100000; 	  		if (n4 <= 0) 		{ 			printf("age4=%6d is to small!\n",age4); 			age++; 			continue; 		} 		else if (n2>9) 		{ 			printf("age2=%6d is to big!\n",age4); 			break; 		}  		printf("age2 = %6d  age3 = %6d  age4=%6d  ",age2,age3,age4); 		age3 = age * age * age ; 	   		while (age3) 		{ 			int k= age3 % 10; 			age3 /= 10; 			if(a[k] !=-1) 			{ 				n3 = -1; 				break; 			} 			else 			{				 				a[k] = k; 			} 		}   		if(n3 == -1) 		{ 			printf("age3 is reshow!\n"); 			age++; 			continue; 		}     		while (age4) 		{ 			int w = age4%10; 			age4 /= 10; 			if (a[w] != -1) 			{ 				n4 = -1; 				break; 			} 			else 				a[w] = w; 		} 			  		if (n4 == -1) 		{ 			printf("age4 is reshow!\n"); 			age++; 			continue; 		} 		printf("这位同学的年龄是%d\n",age); 		break; 	}     while(1);        return age; }

user: user-0
content: 引用 17 楼 lc10915819 的回复:  [quote=引用 14 楼 my_live_123 的回复:] bug1,你的平方条件还没有用噻，问题条件都没有用完  bug2:这个逻辑错误，试想一部分相等，并不成立，你却输出结果了   for(i = 0 ; i <= 9 ; i++)                 {                      if (a[i] == s[i])                    printf("这位同学的年龄是%d\n",age);                    break;                  }            建议：你可以设置a[0]-a[9]值为1，然后算的各位数字为索引i，设置a[i]=0，计算过程中遇到a[j]=0，说明此j数字已经出现，就不必往下继续计算，结束此次循环。否则，计算完毕必定是结果，因为此次循环共产生10个数字，此次循环能执行到底，说明每个数字出现且仅出现一次。跳出循环输出结果结论。此外，未能执行到底的循环，记得把a[0]-a[9]还原到初始1的状态。  这样就不必排序，也能缩短计算时间（因为不满足的，中间就会停止本次循环）而且答案是惟一的，找到即可  其实我有一一种更加投机的想法：把这十个数相加，如果等于 1+2+。。。+9 ，则输出。这样子，岂不是更快？ 代码如下：结果还是18~~  #include<stdio.h> #include<math.h>  int main(void) {     int age = 18;     int age3,age4,result=0,temp = 0;     int  a[10],i,t,j;     int  s[10]={0,1,2,3,4,5,6,7,8,9}; 	do{ 		age3 = pow(age,3); 		for(i = 0 ; i <= 3 ; i++) 		{ 			a[i] = age3 % 10; 			age3 /= 10; 		} 		age4 = pow(age,4); 		 		for(i = 4 ; i <= 9 ; i++) 		{ 			a[i] = age4 % 10; 			age4 /= 10; 		} 		for(int i=0; i <10 ; i++) 		{ 			temp += i ; 			result +=a[i]; 		} 		if(temp == result) 		{ 			printf("这位同学的年龄是%d\n",age);		 		     break ; 		}  		age++; 	}     while(age <= 21);        return 0 ; } [/quote] 是满足0-9含有这10个数字，不是和相等。如果是两个2，那也等于1+3啊。条件不久不满足了么？

user: user-6
content: 简化一下； for(i=0;i<=9;i++) {   if(a[i]!=i) break; } if(i==10) printf("..............");

user: user-7
content: 引用 5 楼 zhouchichi203 的回复:试试：将   for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i])                   printf("这位同学的年龄是%d\n",age);                   break;                 }              改为： for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i]) 					  ; 				  else                   break;                 }  		 			   if(i==10) 				   printf("这位同学的年龄是%d\n",age); 最后判断应该是这样，if(i==10)                     {                          printf("这位同学的年龄是%d\n",age);                           break;                      } 输出结果后，最后要跳出do-while循环，用break

user: user-0
content: 引用 5 楼 zhouchichi203 的回复:试试：将   for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i])                   printf("这位同学的年龄是%d\n",age);                   break;                 }              改为： for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i]) 					  ; 				  else                   break;                 }  		 			   if(i==10) 				   printf("这位同学的年龄是%d\n",age); 空语句的引用以及下面if（i == 10）的判断，没明白。注释下，谢谢啦

user: user-0
content: 引用 5 楼 zhouchichi203 的回复:试试：将   for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i])                   printf("这位同学的年龄是%d\n",age);                   break;                 }              改为： for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i]) 					  ; 				  else                   break;                 }  		 			   if(i==10) 				   printf("这位同学的年龄是%d\n",age); 求深层次的解释下。谢谢

user: user-4
content: 引用 6 楼 u012259895 的回复:[quote=引用 5 楼 zhouchichi203 的回复:] 试试：将   for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i])                   printf("这位同学的年龄是%d\n",age);                   break;                 }              改为： for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i]) 					  ; 				  else                   break;                 }  		 			   if(i==10) 				   printf("这位同学的年龄是%d\n",age); 最后判断应该是这样，if(i==10)                     {                          printf("这位同学的年龄是%d\n",age);                           break;                      } 输出结果后，最后要跳出do-while循环，用break[/quote]不用跳出吧，有可能有多解呢？

user: user-8
content: 本题真的有正解吗？

user: user-4
content: 试试：将   for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i])                   printf("这位同学的年龄是%d\n",age);                   break;                 }              改为： for(i = 0 ; i <= 9 ; i++)                {                     if (a[i] == s[i]) 					  ; 				  else                   break;                 }  		 			   if(i==10) 				   printf("这位同学的年龄是%d\n",age);