UVA 725
题意:0~9十个数组成两个5位数(或0开头的四位数),要求两数之商等于输入的数据n。abcde/fghij=n。
思路:暴力枚举,枚举fghij的情况算出abcde判断是否符合题目条件。(注意前导零的判断)
枚举的方法为 for(int i=1234;i<=100000/n;i++){}
#include<cstdio> #include<cstring> int num[10]; bool check(int a,int b) { memset(num,0,sizeof num); if(b>98765) return false; if(a<10000) num[0]++; if(b<10000) num[0]++; while(a) { num[a%10]++; a/=10; } while(b) { num[b%10]++; b/=10; } for(int i=0;i<10;i++) { if(num[i]>1) return false; } return true; } int main() { int n,cnt=0; while(~scanf("%d",&n),n!=0) { if(cnt>0) printf(" ");cnt++; int flag=0; for(int i=1234;i<=100000/n;i++) { if(check(i,i*n)) { flag=1; printf("%05d / %05d = %d ",i*n,i,n); } } if(flag==0) printf("There are no solutions for %d. ",n); } return 0; }
UVA 10976
题意:输入正整数k,找到所有的正整数x>=y使得1/k=1/x+1/y;
思路:枚举x,y,考虑枚举范围,因为x>=y,1/x<=1/y,所以y<=2k。在k+1到2k范围内枚举y,计算出对应的x。
#include<cstdio> int res[10010][2]; int main() { int k; while(~scanf("%d",&k)) { int x,y; int cnt=0; for(y=k+1;y<=2*k;y++) { if((k*y)%(y-k)==0) { x=(k*y)/(y-k); res[cnt][0]=x;res[cnt++][1]=y; } } printf("%d ",cnt); for(int i=0;i<cnt;i++) { printf("1/%d = 1/%d + 1/%d ",k,res[i][0],res[i][1]); } } return 0; }
枚举:根据题目条件,可以缩小枚举的范围,枚举某个数,算出另个数判断是否符合条件。