题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1716
这个思路最难的便是列出所有四位数,确实有几次我差点想换个思路,因为我实在想不到怎么输出四位数,还好,编程最不可缺的便是一股倔强,没有解决不了的问题,只有不敢去尝试的问题。走一步再走一步,翻过那座山,前方就是浩瀚的大海。
#include int main() { int shu[4] = {1},frist = 1;//shu存四张卡片 while(1) { int sum[26], Sum, t = -1; for(int i = 0; i < 4; i++)//输入四张卡片的数 scanf("%d",&shu[i]); if(!(shu[0]+shu[1]+shu[2]+shu[3])) break;//当四个为零时退出 if(frist) frist = 0; else printf("/n"); for(int i = 0; i < 4; i++)//造出所有 i 开头的四位数并排序输出 { int ok = 0; for(int j = (i+1)%4; j%4 != i; j++) { Sum = shu[i] * 1000 + shu[j%4] * 100; if((j + 1)%4 == i) { sum[++t] = Sum + shu[(j+2)%4]*10 +shu[(j+3)%4]; sum[++t] = Sum + shu[(j+3)%4]*10 +shu[(j+2)%4]; } else if((j+2)%4 == i) { sum[++t] = Sum + shu[(j+1)%4]*10 +shu[(j+3)%4]; sum[++t] = Sum + shu[(j+3)%4]*10 +shu[(j+1)%4]; } else { sum[++t] = Sum + shu[(j+1)%4]*10 +shu[(j+2)%4]; sum[++t] = Sum + shu[(j+2)%4]*10 +shu[(j+1)%4]; } } for(int i = t - 5; i <= t; i++) { int k = i, p, min = sum[i]; for(int j = i + 1; j <= t; j++) if(min > sum[j]) {min = sum[j]; k = j;} if(k != i) { p = sum[i]; sum[i] = sum[k]; sum[k] = p; } } if(t - 10 > 0 && sum[t - 5]/1000 != sum[t - 10]/1000) ok = 1;//如果与上一行的开头不同则可以输出,防止1124这种重复 else if(t - 10 < 0) ok =1; if(ok) { if(sum[t - 5] > 999) { printf("%d", sum[t - 5]); for(int i = t - 4; i <= t; i++) { if(sum[i] != sum[i-1]) printf (" %d",sum[i]); } printf("/n"); } } } } return 0; }