《算法竞赛入门经典》第二章 2.4
任务1:
1 #include<stdio.h> 2 int main() 3 { 4 int i, n; 5 scanf("%d",&n); 6 for(i = 1; i <= n; i++) 7 { 8 printf("%d\n",2*i); 9 } 10 return 0; 11 }
1 #include<stdio.h> 2 int main() 3 { 4 int i, n; 5 scanf("%d",&n); 6 for(i = 2; i <=2* n; i+=2) 7 { 8 printf("%d\n",i); 9 } 10 return 0; 11 }
任务2:
1 #include<stdio.h> 2 int main() 3 { 4 double i; 5 for(i = 1; i !=10 ;i += 0.1) 6 { 7 printf("%0.1f", i); 8 } 9 return 0; 10 }
因为我知道浮点数的存储……所知知道会一直运行。。
2.4.4 C++中的输入输出
1 #include<cstdio> 2 int main() 3 { 4 int a, b; 5 while(scanf("%d%d", &a, &b) == 2) 6 printf("%d\n", a+b); 7 return 0; 8 }
上面的用法第一次见到还是考研复试的时候,看了王道的考研机试。。
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a, b; 6 while(cin>> a >> b) cout<< a+b << "\n"; 7 return 0; 8 }
上面的程序在codeblocks没有问题,而在其命令行下则有错误……
错误:/tmp/cc3xkv3G.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
解决办法:将.cpp文件改为.c文件编译
或者这样编译gcc <source> -lstdc++
或者改用g++编译
之所以前面的例子多没有错误,是因为我保存文件到test.cpp用gcc编译都当成c来处理了,这次写成c++还是用g++编译吧。
2.4.6 上机练习
习题2-1 位数(digit)
1 #include<stdio.h> 2 int main() 3 { 4 int n, count = 0; 5 scanf("%d", &n); 6 while(n!= 0) 7 { 8 n/=10; 9 count++; 10 } 11 printf("%d\n", count); 12 return 0; 13 }
习题2-2 水仙花数(daffodil)
1 #include<stdio.h> 2 int main() 3 { 4 int i, j, k, count = 0, tmp1, tmp2; 5 for(i = 1; i<=9; i++) 6 for(j = 0;j <=9;j++) 7 for(k = 0;k <=9; k++) 8 { 9 tmp1 = (100*i+10*j+k); 10 tmp2 = (i*i*i+j*j*j+k*k*k); 11 if(tmp1 == tmp2) 12 printf("%d\n",tmp1); 13 } 14 15 return 0; 16 }
习题2-3 韩信点兵 (hanxin)
习题2-4 倒三角数 (triangle)
#include<stdio.h>
int main()
{
int n, i, j, k;
scanf("%d", &n);
for(i = n; i >=0 ;i--)
{
for(k = 0;k <=i-1; k++)
printf(" ");
printf("\n");
for(j=1; j <=2*i -1;j++)
printf("#");
printf("\n");
}
return 0;
}
习题2-5 统计 (stat)
习题 2-6调和级数(harmony)
习题 2-7 近似计算 (approximation)
#include<stdio.h>
int main()
{
const float eps = 0.0000001;
int i;
float S = 0, tmp;
for(i = 1; ;i++)
{
tmp = 1/(2*i-1);
if(i%2 == 1)
S+= tmp;
else
S-= tmp;
if(tmp - eps <10*eps)
break;
}
printf("%f\n", S);
return 0;
}
习题 2-8 子序列的和(subsequence)
#include<stdio.h>
int main()
{
int n, m, i;
double S = 0;
scanf("%d%d", &n, &m);
for(i = n; i<=m; i++)
{
S+= (double)1/(i*i);
if(i >= 35)
break;
}
printf("%0.5lf",S);
return 0;
}
习题 2-9 分数化小数(decima)
习题 2-10 排列 (permutation)