邯郸建设局公开网站,网站营销看法,设计企业网站流程,免费空间域名申请如果x加上x的各个数字之和得到y#xff0c;就说x是y的生成元。 给出n#xff08;1≤n≤100000#xff09;#xff0c;求最小生成元。 无解输出0。 例如#xff0c;n216#xff0c;121#xff0c;2005时的解分别为198#xff0c;0#xff0c;1979。
我的思路很简单就说x是y的生成元。 给出n1≤n≤100000求最小生成元。 无解输出0。 例如n2161212005时的解分别为19801979。
我的思路很简单就是枚举每输入一个数n就从1到n-1开始枚举代码如下。
#includestdio.h
#includeiostream
#includeString.husing namespace std;
int sum(int n)// 求n加上n的各个数字之和
{int s 0, n1 n;while(n1 ! 0){s n1%10;n1 / 10;}return sn;
}
int main()
{int n,i ;while(1){scanf(%d, n);for(i0; in; i){if(sum(i) n){printf(%d\n, i);break;}}if(i n) printf(%d\n, 0);}
} 但是这种做法需要每次计算n-1次因此可以考虑建一个10000长度的表存每个数的最小生成元每次输入n直接从表中查。
#includestdio.h
#includeiostream
#includeString.h#define MAXN 100000
using namespace std;
int ans[MAXN] {0};int main()
{int n,i ;for(i 1; i MAXN; i){int x i, y i;while(x 0) { y x % 10; x / 10;} //求i和i每位的和 if(ans[y] 0 || i ans[y]) ans[y] i;//注意是“最小”生成元 }while(1){cin n;cout ans[n] endl;}
}