好久前买了《算法竞赛入门经典》,想着学习算法。一直拖到今天才开始做题……
所以开了个文件,把这里面的习题做完后都放上来,也方便以后回看。
- 水仙花数
- 题目:若三位数ABC满足ABC = A3 + B3 + C3 ,则称ABC为水仙花数。输出100~999中的所有水仙花数。
- 代码:
//水仙花数
void Daffodil()
{
for (int i=1; i<=9; i++)
{
for (int j=0; j<=9; j++)
{
for (int k=0; k<=9; k++)
{
int left = i*100 + j*10 + k;
int sum = pow(i,3)+pow(j,3)+pow(k,3);
if (left==sum && 100<=sum && sum<1000)
{
printf("%d=%d^3+%d^3+%d^3\n",sum,i,j,k);
}
}
}
}
}
- 韩信点兵
- 题目:给定一个正整数模3,5,7的三个余数,求[10,100]以内满足条件最小的数
- 代码:
//韩信点兵
int Hanxin(const int& a, const int& b, const int& c)
{
for (int i=10; i<=100; i++)
{
if (i%3==a && i%5==b && i%7==c)
{
return i;
}
}
return 0;
}
倒三角形
- 题目:输入n,输出n层的倒三角形
- 代码:
//倒三角形 void triangle(const int& n) { int row = n, col = 2*n-1; for (int i=0; i<n; i++) { for (int j=0; j<col; j++) { if (j<i || j>=col-i) printf(" "); else printf("*"); } printf("\n"); } }
子序列的和
- 题目:输入 n<m<106 ,输出 1/n2+1/(n+1)2+⋅⋅⋅+1/m2 的值,保留5位小数。
- 代码:
//子序列的和 double subsequence(const int& n, const int& m) { double ans = 0; for (int i=n; i<=m; i++) { double x = (double)i/100; ans +=(1.0 / (x*x)); } return ans/10000; }
分数化小数
- 题目:输入a,b,c,输出 a/b 的小数形式,精确到小数点后c位。c<=100。
- 代码:
void decimal(const int& a, const int& b, const int& c) { int digit = c, last1 = 0, last0 = 0; int m = a / b, r = a % b; printf("%d.",m); while(r!=0) { //update r int pwd = 0; while (r<b) { r *=10; pwd++; } // 补零 for (int i=1; i<pwd; i++) { if(digit > 1) printf("0"); else if (digit == 1) last1 = 0; else if (digit == 0) last0 = 0; digit--; if (digit < 0) { printf("0"); return; } } m = r / b; if (digit > 1) printf("%d",m); else if (digit == 1) last1 = m; else if (digit == 0) last0 = m; r %=b; digit--; if (digit < 0) break; } if (r <= 0) { while (digit--) { printf("0"); } printf("\n"); return; } if (last0 >= 5) last1++; printf("%d\n",last1); }
排列
- 题目:用1~9组成3个三位数abc,def和ghi,每个数字恰好使用一次。要求 abc:def:ghi=1:2:3 ,输出所有满足的组合。
- 分析:搞了很久都没做出来,后来上网搜了一下。感谢牛人,原来此题关键在于1~9这九个数字的和只能是45,积只能是362880,所以用这个条件很快就找到了~
- 代码:
void permutation() { for (int i=123; i<=329; i++) { int f = i, s = 2*i, t = 3*i; int add=0, mul=1; getResult(f,add,mul); getResult(s,add,mul); getResult(t,add,mul); //1~9加起来只能是45, 1~9乘起来只能是362880 if (add==45 && mul==362880) printf("%d %d %d\n",f,s,t); } } void getResult(int val, int& add, int& mul) { int MOD = 10; for (int i=1; i<=3; i++) { add +=(val%MOD); mul *=(val%MOD); val /=MOD; } }
以上,便是第一篇记录(难得贴了6道题。。。果然还是题目太简单了)