算法竞赛QQ群:210838572,一起进步吧!
例题代码
2-1 aabb(7744问题)
// 2-1
#include <stdio.h>
int main()
{
for(int x = 1; ; x++)
{
int n = x*x;
if(n<1000) continue;
if(n>9999) break;
if(n/100%10 == n/1000 && n/10%10 == n%10)
{
printf("%d\n", n);
}
}
return 0;
}
2-2 3n+1问题
// 2-2
#include <stdio.h>
int main()
{
int n;
int i;
scanf("%d", &n);
long long int temp;
temp = n;
for(i = 0;;i++)
{
if(temp == 1) break;
if(temp%2 == 1) temp = 3*temp+1;
else temp /= 2;
}
printf("%d\n", i);
return 0;
}
2-3 近似计算
// t2-3
#include <stdio.h>
int main()
{
double sum = 0;
for(int i = 1; ; i++)
{
double temp = 1.0/(i*2-1);
if(i%2 == 1) sum += temp;
else sum -= temp;
if(temp < 1e-6) break;
}
printf("%.6f\n", sum);
return 0;
}
2-4 阶乘之和
此代码比书中的代码效率高。
// 2-4
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
long long int sum = 0;
long long int factorial = 1;
for(int i = 1; i <= n; i++)
{
factorial *= i;
factorial = factorial%1000000;
sum += factorial;
sum = sum%1000000;
}
int res = sum;
printf("%d\n", sum);
return 0;
}
2-5 数据统计
// 2-5
#include <stdio.h>
int main()
{
int x, n = 0, lit = 2000000000, lar = -2000000000, s = 0;
while(scanf("%d", &x))
{
s += x;
if(x > lar) lar = x;
if(x < lit) lit = x;
n++;
}
printf("%d %d %.3f\n", lit, lar, (double)s/n);
return 0;
}
注:2-6这里就略过啦,它只是用文件输入输出的方式重写了一遍。
习题代码
t2-1 水仙花数(daffodil)
// t2-1
#include <stdio.h>
int main()
{
int n, a, b, c;
for(n = 100; n <=999; n++)
{
a = n/100;
a = a*a*a;
b = n/10%10;
b = b*b*b;
c = n%10;
c = c*c*c;
if(n == a+b+c) printf("%d\n", n);
}
return 0;
}
t2-2 韩信点兵(hanxin)
// t2-2
#include <stdio.h>
int main()
{
int a, b, c, i;
while(scanf("%d%d%d", &a, &b, &c))
{
for(i = 10; i <= 100; i++)
{
if(i%3 == a && i%5 == b && i%7 == c)
{
printf("%d\n", i);
break;
}
}
if(i = 101) printf("No answer\n");
}
return 0;
}
t2-3 倒三角形(triangle)
// t2-3
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
for(int i = 2*n-1, j =0; i >= 1; i-=2, j++)
{
for(int k = 1; k <= j; k++)
{
printf(" ");
}
for(int k = 1; k <= i; k++)
{
printf("#");
}
printf("\n");
}
return 0;
}
t2-4 子序列的和(subsequence)
// t2-4
#include <stdio.h>
int main()
{
double n, m, tmp, sum = 0;
int times = 0;
while(scanf("%lf%lf", &n, &m) && n)
{
times++;
sum = 0;
for(double i = n; i <= m; i = i + 1.0)
{
tmp = 1/i/i;
sum += tmp;
}
printf("Case %d: %.5f\n", times, sum);
}
return 0;
}
t2-5 分数化小数(decimal)
这道题我暂时没有找到不使用数组的解决办法,如果谁有好的想法欢迎交流!
// t2-5
#include <stdio.h>
int num[101] = {0};
int main()
{
long int a, b, c, tmp;
while(scanf("%d%d%d", &a, &b, &c) && a)
{
printf("%d", a/b);
if(c > 0)
{
printf(".");
tmp = a;
for(long int i = 1; i <= c+1; i++)
{
tmp = tmp*10;
num[i] = tmp/b;
tmp = tmp%b;
}
if(num[c+1] >= 5)
{
num[c]++;
for(long int i = c; i > 1; i--)
{
if(num[i] >= 10)
{
num[i-1]++;
num[i] = 0;
}
else
{
break;
}
}
}
for(long int i = 1; i <= c; i++)
{
printf("%d", num[i]);
}
}
printf("\n");
}
return 0;
}
t2-6 排列(permutation)
此题我看到别人有用数组解决的,但是考虑到这一题放在第二章,就先不使用数组练练手吧。
// t2-6
#include <stdio.h>
int main()
{
int use[10] = {0};
for(int a = 1; a <= 9; a++)
{
use[a] = 1;
for(int b = 1; b <= 9; b++)
{
if(use[b] == 0)
{
use[b] = 1;
for(int c = 1; c <= 9; c++)
{
if(use[c] == 0)
{
use[c] = 1;
for(int d = 1; d <= 9; d++)
{
if(use[d] == 0)
{
use[d] = 1;
for(int e = 1; e <= 9; e++)
{
if(use[e] == 0)
{
use[e] = 1;
for(int f = 1; f <= 9; f++)
{
if(use[f] == 0)
{
use[f] = 1;
for(int g = 1; g <= 9; g++)
{
if(use[g] == 0)
{
use[g] = 1;
for(int h = 1; h <= 9; h++)
{
if(use[h] == 0)
{
use[h] = 1;
for(int i = 1; i <= 9; i++)
{
if(use[i] == 0)
{
if(g*100+h*10+i == 3*(a*100+b*10+c) && d*100+e*10+f == 2*(a*100+b*10+c))
printf("%d%d%d %d%d%d %d%d%d\n", a, b, c, d, e, f, g, h, i);
}
}
use[h] = 0;
}
}
use[g] = 0;
}
}
use[f] = 0;
}
}
use[e] = 0;
}
}
use[d] = 0;
}
}
use[c] = 0;
}
}
use[b] = 0;
}
}
use[a] = 0;
}
return 0;
}